home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / music / ptsupp.lha / PT Support archive / Sources / ProPrunerRep.S < prev    next >
Text File  |  1996-01-30  |  70KB  |  2,817 lines

  1.  
  2. ; ProPruner example code, look below for more information.
  3. ; Maximum stack usage : ca. 108 bytes.
  4.  
  5. PPR_68020    =    1
  6. PPR_NotePlayer    =    0
  7.  
  8. Go        move.l    4.w,a6
  9.         jsr    -132(a6)        ; _LVOForbid
  10.  
  11.         moveq.l    #0,d0
  12.         lea.l    GfxName(pc),a1
  13.         move.l    4.w,a6
  14.         jsr    -552(a6)        ; _LVOOpenLibrary
  15.  
  16.         tst.l    d0
  17.         beq.w    Exit
  18.  
  19.         lea.l    GfxBase(pc),a0
  20.         move.l    d0,(a0)
  21.  
  22.         bsr.w    GetVBR
  23.  
  24.         lea.l    PPR_MainData(pc),a0
  25.         move.l    d0,PPRM_VBR(a0)
  26.  
  27.         lea.l    Module,a0
  28.         bsr.w    PPR_Init        ; Initialize replay
  29.  
  30. MainLoop    move.l    GfxBase(pc),a6
  31.         jsr    -270(a6)        ; _LVOWaitTOF
  32.  
  33. .BeamLoop    move.l    GfxBase(pc),a6
  34.         jsr    -384(a6)        ; _LVOVBeamPos
  35.  
  36.         move.w    #$000,$dff180
  37.  
  38.         and.l    #$c0,d0
  39.         beq.s    .BeamLoop
  40.  
  41.         move.w    #$fff,$dff180
  42.         bsr.w    PPR_Music        ; Play some
  43.         move.w    #$000,$dff180        ; $78a
  44.  
  45.         btst    #6,$bfe001        ; ...And loop
  46.         bne.s    MainLoop
  47.  
  48.         bsr.w    PPR_End            ; Disable all notes.
  49.  
  50.         move.l    4.w,a6
  51.         jsr    -138(a6)        ; _LVOPermit
  52.  
  53.         move.l    GfxBase(pc),a1
  54.         move.l    4.w,a6
  55.         jsr    -414(a6)        ; _LVOCloseLibrary
  56.  
  57. Exit        moveq.l    #0,d0
  58.         rts
  59.  
  60. ;------------------------------------------------------------------------------
  61. ;Function:    VBR=GetVBR()
  62. ;Purpose:    Obtain vectorbaseregister independent of processor hardware.
  63. ;------------------------------------------------------------------------------
  64.  
  65. GetVBR        moveq.l    #0,d0
  66.         move.l    4.w,a6
  67.         btst.b    #0,297(a6)
  68.         beq.w    .Not68010
  69.         lea.l    VBR_Exec(pc),a5
  70.         jsr    -30(a6)            ; _LVOSupervisor
  71.  
  72. .Not68010    rts
  73.  
  74. ;Code to execute if processor >= 68010.
  75. ;Since not all assemblers handle the movec vbr,(ea) instruction, the opcode is
  76. ;included.
  77.  
  78. VBR_Exec    ;dc.l    $4e7a0801        ; = MOVEC VBR,D0
  79.         movec    vbr,d0
  80.         rte
  81.  
  82. GfxBase        dc.l    0
  83. GfxName        dc.b    "graphics.library",0
  84.     even
  85.  
  86. ;------------------------------------------------------------------------------
  87. ;==            NOTEPLAYER INTERFACE                     ==
  88. ;------------------------------------------------------------------------------
  89. PPRN_InitReg    macro    ; (Channel)
  90.         lea.l    $dff0a0,a5
  91.         endm
  92.  
  93. PPRN_KillSound    macro
  94.         endm
  95.  
  96. PPRN_KillCh    macro
  97.         endm
  98.  
  99. PPRN_TrigWave    macro    ; (Wavestart, Wavelen)
  100.         endm
  101.  
  102. PPRN_SetWave    macro    ; (Wavestart, Wavelen)
  103.         endm
  104.  
  105. PPRN_SetVolume    macro    ; (Volume)
  106.         endm
  107.  
  108. PPRN_SetRate    macro    ; (Rate)
  109.         endm
  110.  
  111. PPRN_SetMVolL    macro    ; (MVolume)
  112.         endm
  113.  
  114. PPRN_SetMVolR    macro    ; (MVolume)
  115.         endm
  116.  
  117. PPRN_Filter    macro    ; (State)
  118.         endm
  119.  
  120. ; Do actual mixing and trig replay.
  121. PPRN_MakeSound
  122.         rts    ; This is _NOT_ a macro!
  123.  
  124.  
  125.  
  126. ;------------------------------------------------------------------------------
  127. ;
  128. ;    $VER: ProPruner v1.21 Playroutine - by Håvard "Howard" Pedersen
  129. ;    © 1993-96 Mental Diseases
  130. ;    STRICTLY FOR PRIVATE USE!!!
  131. ;
  132. ;    Based on the ProPacker v2.1 playroutine by Estrup/Static Bytes and his
  133. ;    own improvement-ideas for ProPacker v3.0.
  134. ;
  135. ;    I cannot be held responsible for any damage caused directly or in-
  136. ;    directly by this code. Still, every released version is thouroughly
  137. ;    tested with Mungwall and Enforcer, official Commodore debugging tools.
  138. ;    These programs traps writes to unallocated ram and reads/writes to/from
  139. ;    non-ram memory areas, which should cover most bugs.
  140. ;
  141. ;    HISTORY:
  142. ;
  143. ;v0.4    Called ProCracker. Basically very similar to ProPacker v2.1.
  144. ;    * Added mastervolume possibilities through SetMasterVol().
  145. ;    * Added synchronization-byte sent trough effectcommand 8.
  146. ;    * Added restart-flag.
  147. ;
  148. ;v1.0    Renamed to ProPruner. First really useful version. This replay was
  149. ;    used in the "Hypnophone" musicdisk by Compact.
  150. ;    * Separate samplefile.
  151. ;    * Friendly DMA-wait using VHPOSR.
  152. ;    * Wrote ProPrunerStrip and ProPrunerSampler to simplify usage of
  153. ;      separate samplefiles.
  154. ;    * Added PreDouble boolean to speed up replay.
  155. ;    * Speeded up replay in numerous ways.
  156. ;    * Possibility to turn off mastervolume with MasterVol boolean.
  157. ;    * Possibility to disable audio channels.
  158. ;    * Added delta processing.
  159. ;    * Added support for speed 0 to halt module.
  160. ;    * Speeded up mastervolume routines by using macros instead of sub-
  161. ;      routines.
  162. ;    * Readded FineTune boolean. By some reason, it got deleted during the
  163. ;      development of v0.4. (My finetune boolean will save space as well as
  164. ;      rastertime!)
  165. ;    * Gave user possibility to fetch the VBR and pass to ProPruner.
  166. ;    * Added CIA possibilities. (You must add the interrupt yourself!)
  167. ;
  168. ;v1.1    Optimizations starts getting noticeable. Average speed on a normal A500
  169. ;    should be about 4-5 lines! Source-size is also increasing.
  170. ;    * DMAWait waited 224 ns instead of 280. It worked fine on my A1200, but
  171. ;      could fuck up on a 80 mHz 68060 with FPU and 60 ns fastram. (Or
  172. ;      something...)
  173. ;    * Small optimization on WaitDMA.
  174. ;    * To save further time when waiting for the DMA, WaitDMA is changed
  175. ;      from a subroutine to a macro. Now my WaitDMA macro provides minimum
  176. ;      overhead.
  177. ;    * PPR_Music() now trashes all registers except A7. This may optimize a
  178. ;      bit if your interrupt-code saves all registers anyway. (Mine does!)
  179. ;    * Numerous optimizations.
  180. ;    * Added boolean for 68020+ optimizations.
  181. ;    * Fixed the way PPR_Init() and PPR_End() disabled/enabled playing to
  182. ;      prevent audible bugs from occur when PPR_Music() was called while
  183. ;      initializing variables.
  184. ;    * Added DMADelay constant for user-selectable delay when using DMAWait.
  185. ;    * Optimized the MasterVolume code particulary.
  186. ;    * Several locations in the source used the clear-command on hardware
  187. ;      registers. This behaviour is discouraged by Commodore and is now
  188. ;      fixed.
  189. ;    * Added (selectable) PPR_Pause() and PPR_Continue().
  190. ;    * Added (selectable) PPR_Forward() and PPR_Rewind().
  191. ;    * Enforcer checked and found reliable. =D
  192. ;    * Removed a rather nasty bug of mine, which caused some modules to be
  193. ;      played without the fourth channel. (Not sure when it appeared, but I
  194. ;      admit it's mine...) :(
  195. ;    * Optimized finetune a lot.
  196. ;    * Made PPR_Level6 default to FALSE, since it's shitty implemented
  197. ;      concidering the lovely multitasking environment of the Amiga.
  198. ;
  199. ;v1.2    Things are getting somewhere. The need for a separate packer starts to
  200. ;    rise. Sourcesize is 69 Kb, more than three times the size of the
  201. ;    original ProPacker v2.1 replay!
  202. ;    * PPR_Init didn't reset the tempo when in CIA mode. Fixed.
  203. ;    * Halting the module with F00 didn't trig restartflag. Fixed.
  204. ;    * Set volume didn't work at all when PPR_MasterVol was set to true. 8(
  205. ;    * Finally added the PowerPattern structure I've been dreaming about.
  206. ;      Finetune, toneportamento and arpeggio were drastically optimized due
  207. ;      to this.
  208. ;    * Cleaned up the source a lot by making definitions of the voicedata-
  209. ;      and maindata- variables and ensured the entire source used it.
  210. ;    * Optimized the voicedata- and maindata-variables to make longword
  211. ;      accesses on longword boundaries.
  212. ;    * Toneportamento with finetune enabled would play crazy notes! Fixed.
  213. ;    * Indirext addressing is now used when accessing all variables,
  214. ;      resulting in even better speed.
  215. ;    * The play-routine is now (finally!) completely PC-relative.
  216. ;    * A long-standing bug could have caused the sample-addresses to become
  217. ;      totally fucked up. Fixed. (Another one bites the dust! 8)
  218. ;    * Numerous small optimizations. As always, I fucked up during
  219. ;      optimizing and had to compare the source line by line to an older
  220. ;      version to find the bug I inserted. ;(
  221. ;    * Playroutine now uses less space than earlier, since variables used by
  222. ;      pause, mastervolume etc. is now included based on the switches.
  223. ;    * The demo-source of ProPruner now fetches the VBR correctly.
  224. ;    * Playroutine source now contains version information. :)
  225. ;    * Optimized recognition of effectcommands.
  226. ;    * The demo-source now uses graphics-library for VBL-waiting.
  227. ;    * ProPruner is now fixed to work on almost any assembler! (Some if's
  228. ;      weren't standard in earlier versions...)
  229. ;    * Extended effectcommands are no longer called each frame no matter.
  230. ;      This optimises a lot when these are in use. Pattern delay engine had
  231. ;      to be altered due to this.
  232. ;    * Arpeggio no longer uses divx/mulx, but a counter. (Mo' speed!)
  233. ;    * Added NotePlayer interface to replay. This feature hasn't been tested
  234. ;      at all. Please report any bugs.
  235. ;    * Disabling of channels turned out to be buggy. You wouldn't actually
  236. ;      hear any sound on the disabled channels, but the replay would still
  237. ;      (in some places) adjust volume and turn on and off DMA for disabled
  238. ;      channels. Some people may not see why this was a serious bug, but the
  239. ;      reason for implementing disabled channels at all was to make them
  240. ;      free for sound-effects. (Games!)
  241. ;    * PPR_DMADelay removed. The DMAWait waited longer than it had to. The
  242. ;      CPU obvously wasn't fast enough to keep up with the changes in
  243. ;      VHPOSR. Uses I/O chips for timing.
  244. ;    * Added balance possibilities through left and right mastervolume. No
  245. ;      extra overhead provided.
  246. ;
  247. ;v1.21    Small update.
  248. ;    * Renamed PPR_SetBPM to CIA_SetBPM to obtain compatibility with my
  249. ;      ProTracker replay.
  250. ;    * DMAWait was buggy again. (Hrmph!) Another rewrite. Should be 100%
  251. ;      now. I really apologize, but it's Commodore's fault, they didn't
  252. ;      document the audio hardware thoroughly enough. :(
  253. ;
  254. ;    TODO: (Things to do, bugs to squash...)
  255. ;
  256. ;* Make it possible to disable all handling of sample-pointers by PPR_Init(),
  257. ;  to allow the user to set up samples himself. (For song-like structures!)
  258. ;* Attempt to optimize invert loop.
  259. ;* Make PPR_Init() return errorcodes upon failure.
  260. ;* Optimize filter effectcommand.
  261. ;* Optimize PPR_Init() and PPR_SetMasterVol()
  262. ;* Ensure correct delay in level6-interrupt.
  263. ;* Steal ideas from other replays. (The Player, ProRunner, Promizer...)
  264. ;* Write own packer (with own format).
  265. ;* Get VBR in a nice manner.
  266. ;* Make PPR_Level6 nicer to the OS.
  267. ;* Channels on/off during play. (Too much work...!) (Selectable)
  268. ;* Optimize mastervolume so that only one macro is necessary.
  269. ;* Glissando still uses a loop. 8(
  270. ;* Audio hardware pointers located in the voiceinfo-variables.
  271. ;* Use counter instead of division when doing retrig note. (The last divx/mulx
  272. ;  in the code!)
  273. ;* Convert pattern break parameters to hex.
  274. ;* Use more local labels.
  275. ;* Usecode system like The Player. (With finetune and predouble integrated!)
  276. ;* Optimize WaitDMA to only wait when needed.
  277. ;
  278. ;------------------------------------------------------------------------------
  279. ;
  280. ;    CONSTANTS:
  281. ;
  282. ;Constant:    PPR_Level6(BOOL)
  283. ;Purpose:    If set to TRUE, a level 6 interrupt will be used for timing
  284. ;        delays instead of DMAWait. This gives optimum results, but
  285. ;        should only be enabled if you have EXCLUSIVE access to system
  286. ;        resources! Defaults to FALSE. This require this interrupt to be
  287. ;        free for usage, i.e. it might interfere with CIA.
  288. ;
  289. ;Constant:    PPR_SampleFile(BOOL)
  290. ;Purpose:    If set to TRUE, the samples are given separate to the replayer
  291. ;        upon PPR_Init(). This enables sample sharing and the
  292. ;        possibility to have the songdata located in fast. Defaults to
  293. ;        FALSE.
  294. ;
  295. ;Constant:    PPR_PreDouble(BOOL)
  296. ;Purpose:    If set to TRUE, the module will be processed, resulting in a
  297. ;        faster performance. This might _NOT_ work on all modules,
  298. ;        especially on long ones. Defaults to TRUE. ProPruner will
  299. ;        handle already processed modules.
  300. ;
  301. ;Constant:    PPR_MasterVol(BOOL)
  302. ;Purpose:    If set to TRUE, mastervolume features will be enabled. This
  303. ;        will consume more rastertime than without, therefore it
  304. ;        defaults to FALSE.
  305. ;
  306. ;Constant:    PPR_Delta(BOOL)
  307. ;Purpose:    If set to TRUE, the playroutine will handle delta packed
  308. ;        samples. This needs PPR_SampleFile to be enabled. Defaults to
  309. ;        TRUE if PPR_SampleFile is enabled.
  310. ;
  311. ;Constant:    PPR_Finetune(BOOL)
  312. ;Purpose:    If set to TRUE, the playroutine will handle finetune. Defaults
  313. ;        to TRUE, since most people nowadays uses finetune.
  314. ;
  315. ;Constant:    PPR_CIA(BOOL)
  316. ;Purpose:    If set to TRUE, CIA_SetBPM will be called whenever the CIA
  317. ;        tempo needs to be changed. Defaults to FALSE, since using the
  318. ;        CIA timers in a system-friendly manner is hard. Please remember
  319. ;        that level 6 interrupts will not work with a playroutine called
  320. ;        from within an interrupt. CIA_SetBPM is called with BPM (byte)
  321. ;        in D0, and may only trash D0/D1/A1.
  322. ;
  323. ;Constant:    PPR_68020(BOOL)
  324. ;Purpose:    If set to true, ProPruner will assemble with special 68020+
  325. ;        optimizations. Defualts to FALSE to avoid unexpected crashes.
  326. ;
  327. ;Constant:    PPR_PauseFuncs(BOOL)
  328. ;Purpose:    If set to true, PPR_Pause() and PPR_Continue() will be
  329. ;        included. defaults to false.
  330. ;
  331. ;Constant:    PPR_WindFuncs(BOOL)
  332. ;Purpose:    If set to true, PPR_Forward() and PPR_Rewind() will be
  333. ;        included. defaults to false.
  334. ;
  335. ;Constant:    PPR_PowerPatt(BOOL)
  336. ;Purpose:    If enabled, will cause PPR_Init() to convert the patterndata to
  337. ;        a more suitable format before playing.
  338. ;
  339. ;Constant:    PPR_NotePlayer(BOOL)
  340. ;Purpose:    If enabled, external functions will be used instead of banging
  341. ;        on the Amiga hardware registers when sound is wanted.
  342. ;
  343. ;Constant:    PPR_Channels(0-4)
  344. ;Purpose:    Selects number of channels to play. Nice for games. 8) Defaults
  345. ;        to 4. Disabling channels saves a huge amount of raster time.
  346. ;        NB! Do note that ProPruner will not sense ANY effectcommands on
  347. ;        the disabled channels! (Speed or pattern break...)
  348. ;
  349. ;    FUNCTIONS:
  350. ;
  351. ;Function:    PPR_Continue()
  352. ;Purpose:    Continues the module after a stop caused by PPR_Pause().
  353. ;
  354. ;Function:    PPR_End()
  355. ;Purpose:    Stops any sound currently being played on any audio channel and
  356. ;        brings module to a halt. (In reverse order, that is. :)
  357. ;
  358. ;Function:    PPR_Forward()
  359. ;Purpose:    Skips one position forward. Will restart if at end of module.
  360. ;        !!! This call will miss position jumps !!!
  361. ;
  362. ;Function:    PPR_Init(Module,SampleFile)(A0,A1)
  363. ;Purpose:    Initalize everything. You must call this first. Samplefile is
  364. ;        only necessary if PPR_SampleFile is TRUE. Module-data must be
  365. ;        a ProPacker 2.1 module. Do not call while module is playing,
  366. ;        stop current module with PPR_End() first. This function may
  367. ;        also be used to restart the module.
  368. ;
  369. ;Function:    PPR_Music()
  370. ;Purpose:    Play the module. Call this with an even interval. (50 times per
  371. ;        second gives optimum result.) Do note that this function
  372. ;        trashes all registers.
  373. ;
  374. ;Function:    PPR_Pause()
  375. ;Purpose:    Pauses the module. (Silence)
  376. ;
  377. ;Function:    PPR_Rewind()
  378. ;Purpose:    Skips one position backwards. If at position 0, the module will
  379. ;        wrap to the end. !!! This call will miss position jumps !!!
  380. ;
  381. ;Function:    PPR_SetMasterVol(LeftVolume,RightVolume)(D0.w,D1.w)
  382. ;Purpose:    Adjust the mastervolume of the module. Range is 0-63. Only
  383. ;        callable if PPR_MasterVol is set to TRUE. A value of 64 is also
  384. ;        interpreted as full volume.
  385. ;
  386. ;    DATAFIELDS:
  387. ;
  388. ;Field:        PPRM_Msg(PPR_MainData).b
  389. ;Contents:    Communication byte, sent from module via effect-command 8.
  390. ;
  391. ;Field:        PPRM_SongPos(PPR_MainData).b
  392. ;Contents:    The position of the module currently being played.
  393. ;
  394. ;Field:        PPRM_HiPattern(PPR_MainData).b
  395. ;Contents:    The highest pattern used in the module.
  396. ;
  397. ;Field:        PPRM_RestFlag(PPR_MainData).b
  398. ;Contents    If TRUE, module has restarted.
  399. ;
  400. ;Field:        PPRF_Positions(Module).b
  401. ;Contents:    Total number of positions in module.
  402. ;
  403. ;Field:        PPR_VoiceData+CH*PPRV_sizeof.l
  404. ;Contents:    A copy of the pattern step being played for the moment. For the
  405. ;        format, consult PT-Format.txt. Handy for spectrum analyzers. CH
  406. ;        equals the requested channel. (0-3)
  407. ;
  408. ;Field:        PPR_VoiceData+CH*PPRV_sizeof+PPRV_Volume.b
  409. ;Contents:    Volume of the current note. CH equals the requested channel.
  410. ;
  411. ;Field:        PPRM_VBR(PPR_MainData).l
  412. ;Contents:    Vectorbaseregister. If you'd like to fetch the VBR, do so and
  413. ;        store it here. ProPruner will then use it.
  414. ;
  415. ;    NOTEPLAYER FUNCTIONS AND MACROS:
  416. ;
  417. ;Macro:        PPRN_InitReg (Channel)
  418. ;Purpose:    Initializes A5 to point to the data area needed by the note-
  419. ;        player to perform it's functions.
  420. ;
  421. ;Macro:        PPRN_KillSound
  422. ;Purpose:    Kill all sound on all channels. (Will not have register
  423. ;        initialized!)
  424. ;
  425. ;Macro:        PPRN_KillCh
  426. ;Purpose:    Kill all sound on active channel.
  427. ;
  428. ;Macro:        PPRN_TrigWave (Wavestart, Wavelen)
  429. ;Purpose:    Trigs (immediately) the desired wave.
  430. ;
  431. ;Macro:        PPRN_SetWave (Wavestart, Wavelen)
  432. ;Purpose:    Trigs the wave the next time the repeat needs refreshing.
  433. ;
  434. ;Macro:        PPRN_SetVolume (Volume)
  435. ;Purpose:    Sets the volume for the active channel.
  436. ;
  437. ;Macro:        PPRN_SetRate (Rate)
  438. ;Purpose:    Sets the samplerate for the active channel.
  439. ;
  440. ;Macro:        PPRN_SetMVolL (MVolume)
  441. ;Purpose:    Sets mastervolume for left audiochannels. (Will not have
  442. ;        register initialized!)
  443. ;
  444. ;Macro:        PPRN_SetMVolR (MVolume)
  445. ;Purpose:    Sets mastervolume for tight audiochannels. (Will not have
  446. ;        register initialized!)
  447. ;
  448. ;Macro:        PPRN_Filter (State)
  449. ;Purpose:    Attempts to change the state of a lo-pass filter if such
  450. ;        exists on the output device.
  451. ;
  452. ;Function:    PPRN_MakeSound ()
  453. ;Purpose:    Does everything necessary to actually create sound. Will be
  454. ;        called about one frame _AFTER_ the relevant macros has been
  455. ;        executed.
  456. ;
  457. ;------------------------------------------------------------------------------
  458.  
  459. ; Set all undefined constants to default values. If you dont't like 'em, feel
  460. ; free to change, though you'll have to do it all over for each new version.
  461.  
  462.     ifnd PPR_Level6
  463. PPR_Level6    =    0            ; BOOL
  464.     endc
  465.  
  466.     ifnd PPR_SampleFile
  467. PPR_SampleFile    =    0            ; BOOL
  468.     endc
  469.  
  470.     ifnd PPR_PreDouble
  471. PPR_PreDouble    =    1            ; BOOL
  472.     endc
  473.  
  474.     ifnd PPR_MasterVol
  475. PPR_MasterVol    =    0            ; BOOL
  476.     endc
  477.  
  478.     ifnd PPR_PauseFuncs
  479. PPR_PauseFuncs    =    0            ; BOOL
  480.     endc
  481.  
  482.     ifnd PPR_WindFuncs
  483. PPR_WindFuncs    =    0            ; BOOL
  484.     endc
  485.  
  486.     ifnd PPR_Delta
  487. PPR_Delta    =    PPR_SampleFile        ; BOOL
  488.     endc
  489.  
  490.     ifnd PPR_Finetune
  491. PPR_Finetune    =    1            ; BOOL
  492.     endc
  493.  
  494.     ifnd PPR_CIA
  495. PPR_CIA        =    0            ; BOOL
  496.     endc
  497.  
  498.     ifnd PPR_68020
  499. PPR_68020    =    0            ; BOOL
  500.     endc
  501.  
  502.     ifnd PPR_PowerPatt
  503. PPR_PowerPatt    =    1            ; BOOL
  504.     endc
  505.  
  506.     ifnd PPR_NotePlayer
  507. PPR_NotePlayer    =    0            ; BOOL
  508.     endc
  509.  
  510.     ifnd PPR_Channels
  511. PPR_Channels    =    4            ; Range 0-4
  512.     endc
  513.  
  514. ; Module format definition
  515.  
  516.     RSRESET    ; INSTUMENT INFO
  517. PPRFI_Size    rs.w    1            ; Number of words
  518. PPRFI_Finetune    rs.b    1            ; Only lower 4 bits
  519. PPRFI_Volume    rs.b    1
  520. PPRFI_Repeat    rs.w    1
  521. PPRFI_RepLen    rs.w    1
  522. PPRFI_sizeof    rs.b    0
  523.  
  524.     RSRESET    ; MODULE STRUCTURE
  525. PPRF_Instr    rs.b    PPRFI_sizeof*31
  526. PPRF_Positions    rs.b    1
  527. PPRF_Data    rs.b    1            ; Set to $7f, see PT format
  528. PPRF_PosTab1    rs.b    128
  529. PPRF_PosTab2    rs.b    128
  530. PPRF_PosTab3    rs.b    128
  531. PPRF_PosTab4    rs.b    128
  532. PPRF_Patterns    rs.b    0            ; 128 bytes, offsets in notetab
  533. PPRF_NoteTabL    rs.l    1            ; Size of notetab
  534. PPRF_NoteTab    rs.l    0            ; Table of notes, as PT
  535. PPRF_Samples    rs.w    0            ; May be stripped
  536.  
  537.         ; FLAG set in PPRF_Data
  538. PPRF__Doubled    =    $80
  539. ;;
  540.     RSRESET    ; MAIN VARIABLES
  541. PPRM_SamplePtrs    rs.l    31
  542. PPRM_SongDatPtr    rs.l    1
  543. PPRM_LwtPtr    rs.l    1
  544. PPRM_OldIRQ    rs.l    1    ; Only for level 6 mode
  545. PPRM_VBR    rs.l    1    ; This will always be around.
  546. PPRM_PatternPos    rs.w    1
  547. PPRM_DMAConTmp    rs.w    1
  548. PPRM_Speed    rs.b    1
  549. PPRM_Counter    rs.b    1
  550. PPRM_SongPos    rs.b    1
  551. PPRM_PBreakPos    rs.b    1
  552. PPRM_PosJumpFl    rs.b    1
  553. PPRM_PBreakFl    rs.b    1
  554. PPRM_LowMask    rs.b    1
  555. PPRM_PtDelTime    rs.b    1
  556. PPRM_PtDelCount    rs.b    1
  557. PPRM_HiPattern    rs.b    1
  558. PPRM_Msg    rs.b    1
  559. PPRM_RestFlag    rs.b    1
  560. PPRM_PrePause    rs.b    1    ; Only for pausefuncs
  561. PPRM_pad    rs.b    3
  562. PPRM_sizeof    rs.b    0    ; Must be a multiple of 4!
  563.  
  564.     RSRESET    ; VOICE VARIABLES
  565. PPRV_PatternDat    rs.l    1    ; Copied from the pattern
  566. PPRV_SamplePtr    rs.l    1    ; Pointer to sampledata
  567. PPRV_LoopStart    rs.l    1    ; Pointer to start of loop
  568. PPRV_FunkPtr    rs.l    1    ; Sample pointer for funkrepeat
  569. PPRV_PlaySize    rs.w    1    ; Number of words that are actually played.
  570. PPRV_RepLen    rs.w    1    ; Repeat length in words
  571. PPRV_CurrPer    rs.w    1    ; Period currently playing
  572. PPRV_DMAMask    rs.w    1    ; DMA Mask for channel
  573. PPRV_TPDest    rs.w    1    ; Toneportamento destination
  574. PPRV_MasterVol    rs.w    1
  575. PPRV_TPDir    rs.b    1    ; Toneportamento direction
  576. PPRV_TPPara    rs.b    1    ; Current toneportamento parameter
  577. PPRV_Finetune    rs.b    1    ; Finetune and some flags
  578. PPRV_Volume    rs.b    1    ; Volume for channel
  579. PPRV_VibPara    rs.b    1    ; Current vibrato parameter
  580. PPRV_VibCount    rs.b    1    ; Vibrato count
  581. PPRV_TremPara    rs.b    1    ; Current tremolo parameter
  582. PPRV_TremCount    rs.b    1    ; Vibrato count
  583. PPRV_Control1    rs.b    1    ; Tremolo control / vibrato control
  584. PPRV_Control2    rs.b    1    ; Funkrepeat speed / glissando control
  585. PPRV_ArpCount    rs.b    1    ; Arpeggio count
  586. PPRV_SOffsPara    rs.b    1    ; Sample offset parameter
  587. PPRV_PLoopPos    rs.b    1    ; Pattern loop position
  588. PPRV_PLoopCount    rs.b    1    ; Pattern loop count
  589. PPRV_FunkDuh    rs.b    1    ; Some counter (waitcount for next funk?) for funkrepeat
  590. PPRV_Pad    rs.b    3
  591. PPRV_CurrNote    rs.b    1    ; Notenumber currently playing (Only POWERPATT)
  592. PPRV_pad    rs.b    1
  593. PPRV_sizeof    rs.b    0    ; Must be a multiple of 4!
  594.  
  595. ;------------------------------------------------------------------------------
  596. ;==                INIT                         ==
  597. ;------------------------------------------------------------------------------
  598.  
  599. PPR_Init    lea.l    PPR_MainData(pc),a4
  600.         move.l    a0,PPRM_SongDatPtr(a4)
  601.  
  602.     ifne PPR_SampleFile
  603.         move.l    a1,a2
  604.         lea.l    PPRM_SamplePtrs(a4),a3
  605.         moveq.l    #31-1,d0
  606. .Loop        move.l    (a2)+,d1
  607.         add.l    a1,d1
  608.         move.l    d1,(a3)+
  609.         dbf    d0,.Loop
  610.  
  611.         ifne PPR_Delta
  612.             move.l    124(a1),d0
  613.             beq.s    .NoDelta
  614.  
  615.             clr.l    124(a1)        ; Don't double-delta if called
  616.                         ; several times.
  617.             lea.l    128(a1),a1
  618.             moveq.l    #0,d1
  619. .DLoop            add.b    (a1),d1
  620.             move.b    d1,(a1)+
  621.             subq.l    #1,d0
  622.             bne.s    .DLoop
  623. .NoDelta
  624.         endc
  625.     endc
  626.  
  627.         lea.l    250(a0),a2
  628.         move.w    #511,d0
  629.         moveq.l    #0,d1
  630. .FindPatt    move.l    d1,d2
  631.         subq.w    #1,d0
  632. .FindPatt2    move.b    (a2)+,d1
  633.         cmp.w    d2,d1
  634.         bgt.s    .FindPatt
  635.         dbra    d0,.FindPatt2
  636.         move.b    d2,PPRM_HiPattern(a4)
  637.         addq    #1,d2            ; Patterns stored
  638.  
  639.     ifne PPR_PreDouble
  640.         move.b    PPRF_Data(a0),d3
  641.         and.b    #PPRF__Doubled,d3
  642.         bne.s    .WasDoubled
  643.  
  644.         move.l    d2,d3
  645.         lsl.l    #6,d3            ; *64 = bytes of patterns
  646.         subq.l    #1,d3
  647.  
  648.         move.l    a0,a1
  649.         lea.l    PPRF_Patterns(a1),a1
  650.  
  651. .DoubleLoop    move.w    (a1),d4
  652.         add.w    d4,d4
  653.         add.w    d4,d4
  654.         move.w    d4,(a1)+
  655.         dbf    d3,.DoubleLoop
  656.  
  657.         or.b    #PPRF__Doubled,PPRF_Data(a0)
  658. .WasDoubled
  659.     endc
  660.  
  661. ;Pattern conversion
  662.  
  663.     ifne PPR_PowerPatt
  664.         lea.l    PPRF_Patterns(a0),a1
  665.         moveq.l    #0,d0
  666.         move.b    PPRM_HiPattern(a4),d0
  667.         addq.l    #1,d0
  668.         lsl.l    #7,d0        ; * 128
  669.         add.l    d0,a1
  670.         move.l    (a1)+,d7
  671.         lsr.l    #2,d7
  672.         subq.l    #1,d7
  673.  
  674. ;D0- Temporary        A0- Modulepointer [!!!]
  675. ;D1- Temporary        A1- Notepointer
  676. ;D2- Temporary        A2- Periodtable
  677. ;D3-            A3- Temporary tab ptr
  678. ;D4- Loopcount        A4-
  679. ;D5- Sourcelong        A5-
  680. ;D6- Destlong        A6-
  681. ;D7- Loopcount        A7- [NA]
  682.  
  683.         lea.l    PPR_periodtable(pc),a2
  684. .PowerLoop    move.l    (a1),d5            ; Read source
  685.  
  686.         move.l    d5,d0
  687.         and.l    #$fff,d0
  688.         beq.s    .Skip
  689.         nop
  690. .Skip
  691.         move.l    d5,d0            ; Period
  692.         swap    d0
  693.         and.l    #$fff,d0
  694.         tst.l    d0
  695.         beq.s    .NoNote
  696.  
  697. .WasNote    move.l    a2,a3
  698.         moveq.l    #36-1,d4
  699.         moveq.l    #2,d1            ; Start at offset 2!!!
  700. .PerLoop    move.w    (a3)+,d2
  701.         cmp.w    d0,d2
  702.         beq.s    .FoundPer
  703.         addq.l    #2,d1
  704.         dbf    d4,.PerLoop
  705. .NoNote        moveq.l    #0,d1
  706. .FoundPer    move.b    d1,d6
  707.         lsl.w    #8,d6
  708.  
  709.         move.l    d5,d0            ; Instrument number
  710.         and.l    #$f0000000,d0
  711.         rol.l    #8,d0
  712.         move.l    d5,d1
  713.         and.l    #$0000f000,d1
  714.         lsl.l    #4,d1
  715.         swap    d1
  716.         or.w    d0,d1
  717.         move.b    d1,d6
  718.         lsl.l    #8,d6
  719.         lsl.l    #8,d6
  720.  
  721.         and.l    #$0fff,d5        ; Effect command
  722.         move.w    d5,d6
  723.         move.l    d6,(a1)+
  724.  
  725.         dbf    d7,.PowerLoop
  726.     endc
  727.  
  728.         moveq.l    #0,d2
  729.         move.b    PPRM_HiPattern(a4),d2
  730.         addq    #1,d2            ; Patterns stored
  731.         move.w    d2,d3
  732.         lsl.l    #7,d3
  733.         add.l    #766,d3
  734.         add.l    PPRM_SongDatPtr(a4),d3
  735.         move.l    d3,PPRM_LwtPtr(a4)
  736.  
  737.     ifeq PPR_SampleFile
  738.         lea.l    PPRM_SamplePtrs(a4),a1
  739.         moveq.l    #0,d2
  740.         move.b    PPRM_HiPattern(a4),d2
  741.         addq.l    #1,d2
  742.         lsl.l    #7,d2
  743.         add.l    #762,d2
  744.         add.l    (a0,d2.l),d2
  745.         add.l    PPRM_SongDatPtr(a4),d2
  746.         addq.l    #4,d2
  747.         move.l    d2,a2
  748.         moveq.l    #31-1,d0
  749. .SampleLoop    move.l    a2,(a1)+
  750.         moveq.l    #0,d1
  751.         move.w    (a0),d1
  752.         add.l    d1,d1
  753.         add.l    d1,a2
  754.         lea.l    8(a0),a0
  755.         dbra    d0,.SampleLoop
  756.     endc
  757.  
  758.         or.b    #2,$bfe001        ; Clear filter as default
  759.  
  760.         bsr.s    PPR_VoiceClear
  761.  
  762.     ifne PPR_CIA
  763.         move.b    #125,d0
  764.         bsr.s    CIA_SetBPM
  765.     endc
  766.  
  767.     ifeq PPR_NotePlayer
  768.         lea.l    PPR_VoiceData(pc),a6
  769.         move.w    #1,(PPRV_sizeof*0)+PPRV_DMAMask(a6)
  770.         move.w    #2,(PPRV_sizeof*1)+PPRV_DMAMask(a6)
  771.         move.w    #4,(PPRV_sizeof*2)+PPRV_DMAMask(a6)
  772.         move.w    #8,(PPRV_sizeof*3)+PPRV_DMAMask(a6)
  773.     endc
  774.  
  775.         clr.b    PPRM_RestFlag(a4)
  776.         clr.b    PPRM_SongPos(a4)
  777.         clr.w    PPRM_PatternPos(a4)
  778.  
  779.     ifne PPR_MasterVol
  780.         ifeq PPR_NotePlayer
  781.             lea.l    PPR_VoiceData(pc),a6
  782.             move.w    #64,(PPRV_sizeof*0)+PPRV_MasterVol(a6)
  783.             move.w    #64,(PPRV_sizeof*1)+PPRV_MasterVol(a6)
  784.             move.w    #64,(PPRV_sizeof*2)+PPRV_MasterVol(a6)
  785.             move.w    #64,(PPRV_sizeof*3)+PPRV_MasterVol(a6)
  786.         else
  787.             PPRN_SetMVolL 64
  788.             PPRN_SetMVolR 64
  789.         endc
  790.     endc
  791.  
  792.         move.b    #6,PPRM_Counter(a4)
  793.         move.b    #6,PPRM_Speed(a4)    ; Start playing
  794.  
  795.         rts
  796.  
  797. ;------------------------------------------------------------------------------
  798. ;==                END                         ==
  799. ;------------------------------------------------------------------------------
  800.  
  801. PPR_End        lea.l    PPR_MainData(pc),a4
  802.         move.b    #0,PPRM_Speed(a4)    ; Stop playing
  803.  
  804. PPR_VoiceClear
  805.     ifne PPR_NotePlayer
  806.         ifge PPR_Channels-1
  807.             PPRN_InitReg 0
  808.             PPRN_SetVolume #0
  809.         endc
  810.  
  811.         ifge PPR_Channels-2
  812.             PPRN_InitReg 1
  813.             PPRN_SetVolume #0
  814.         endc
  815.  
  816.         ifge PPR_Channels-3
  817.             PPRN_InitReg 2
  818.             PPRN_SetVolume #0
  819.         endc
  820.  
  821.         ifge PPR_Channels-4
  822.             PPRN_InitReg 3
  823.             PPRN_SetVolume #0
  824.         endc
  825.     else
  826.         lea.l    $dff096,a0
  827.         moveq.l    #0,d0
  828.     ifge PPR_Channels-1
  829.         move.w    #0,$12(a0)
  830.         and.w    #$0001,d0
  831.     endc
  832.     ifge PPR_Channels-2
  833.         move.w    #0,$22(a0)
  834.         and.w    #$0002,d0
  835.     endc
  836.     ifge PPR_Channels-3
  837.         move.w    #0,$32(a0)
  838.         and.w    #$0004,d0
  839.     endc
  840.     ifge PPR_Channels-4
  841.         move.w    #0,$42(a0)
  842.         and.w    #$0008,d0
  843.     endc
  844.         move.w    d0,(a0)
  845.     endc
  846.         rts
  847.  
  848. ;------------------------------------------------------------------------------
  849. ;==                SETMASTERVOL                     ==
  850. ;------------------------------------------------------------------------------
  851.     ifne PPR_MasterVol
  852. PPR_SetMasterVol
  853.         ifne PPR_NotePlayer
  854.             PPRN_SetMVolL d0
  855.             PPRN_SetMVolR d1
  856.         else
  857.             lea.l    PPR_VoiceData(pc),a0
  858.             move.w    d0,(PPRV_sizeof*0)+PPRV_MasterVol(a0)
  859.             move.w    d1,(PPRV_sizeof*1)+PPRV_MasterVol(a0)
  860.             move.w    d1,(PPRV_sizeof*2)+PPRV_MasterVol(a0)
  861.             move.w    d0,(PPRV_sizeof*3)+PPRV_MasterVol(a0)
  862.  
  863.             moveq.l    #0,d0
  864.  
  865.         ifge PPR_Channels-1
  866.             move.b    PPRV_Volume(a0),d0    ; Voice 1
  867.             mulu.w    PPRV_MasterVol(a0),d0
  868.             lsr.w    #6,d0
  869.             move.w    d0,$dff0a8
  870.             lea.l    PPRV_sizeof(a0),a0
  871.         endc
  872.  
  873.         ifge PPR_Channels-2
  874.             move.b    PPRV_Volume(a0),d0    ; Voice 2
  875.             mulu.w    PPRV_MasterVol(a0),d0
  876.             lsr.w    #6,d0
  877.             move.w    d0,$dff0b8
  878.             lea.l    PPRV_sizeof(a0),a0
  879.         endc
  880.  
  881.         ifge PPR_Channels-3
  882.             move.b    PPRV_Volume(a0),d0    ; Voice 3
  883.             mulu.w    PPRV_MasterVol(a0),d0
  884.             lsr.w    #6,d0
  885.             move.w    d0,$dff0c8
  886.             lea.l    PPRV_sizeof(a0),a0
  887.         endc
  888.  
  889.         ifge PPR_Channels-4
  890.             move.b    PPRV_Volume(a0),d0    ; Voice 4
  891.             mulu.w    PPRV_MasterVol(a0),d0
  892.             lsr.w    #6,d0
  893.             move.w    d0,$dff0d8
  894.             lea.l    PPRV_sizeof(a0),a0
  895.         endc
  896.  
  897.             rts
  898.  
  899. PPR_CALCVOL    macro    ;(Register)        ; Inits audio volume while
  900.         moveq.l    #0,\1            ;  scaling it using the master-
  901.         move.b    PPRV_Volume(a6),\1    ;  volume. Free feature trashes
  902.         mulu.w    PPRV_MasterVol(a6),\1    ;  your favourite data-
  903.         lsr.w    #6,\1            ;  register!!! 8)
  904.         move.b    \1,9(a5)
  905.         endm
  906.  
  907. PPR_CALCVOL2    macro    ;(Register)        ; Scaling register using the
  908.         mulu.w    PPRV_MasterVol(a6),\1    ;  mastervolume.
  909.         lsr.w    #6,\1
  910.         endm
  911.  
  912.         endc
  913.     endc
  914.  
  915. ;------------------------------------------------------------------------------
  916. ;==                PAUSE                         ==
  917. ;------------------------------------------------------------------------------
  918.     ifne PPR_PauseFuncs
  919. PPR_Pause    lea.l    PPR_MainData(pc),a4
  920.         move.b    PPRM_Speed(a4),PPRM_PrePause(a4)
  921.         bra.s    PPR_End
  922.  
  923. PPR_Continue    lea.l    PPR_MainData(pc),a4
  924.  
  925.     ifne PPR_NotePlayer
  926.         lea.l    PPR_VoiceData(pc),a0
  927.         moveq.l    #0,d0
  928.  
  929.     ifge PPR_Channels-1
  930.         PPRN_InitReg 0
  931.         move.b    PPRV_Volume(a0),d0
  932.         PPRN_SetVolume d0
  933.     endc
  934.  
  935.     ifge PPR_Channels-2
  936.         PPRN_InitReg 1
  937.         move.b    PPRV_Volume(a0),d0
  938.         PPRN_SetVolume d0
  939.     endc
  940.  
  941.     ifge PPR_Channels-3
  942.         PPRN_InitReg 2
  943.         move.b    PPRV_Volume(a0),d0
  944.         PPRN_SetVolume d0
  945.     endc
  946.  
  947.     ifge PPR_Channels-4
  948.         PPRN_InitReg 3
  949.         move.b    PPRV_Volume(a0),d0
  950.         PPRN_SetVolume d0
  951.     endc
  952.  
  953.     else
  954.             lea.l    PPR_VoiceData(pc),a6
  955.             lea.l    $dff0a0,a1
  956.             moveq.l    #0,d0
  957.  
  958.     ifge PPR_Channels-1
  959.             move.b    PPRV_Volume(a6),d0
  960.         ifne PPR_MasterVol
  961.             PPR_CALCVOL2    d0
  962.         endc
  963.             move.w    d0,$08(a1)
  964.             lea.l    PPRV_sizeof(a6),a6
  965.     endc
  966.  
  967.     ifge PPR_Channels-2
  968.             move.b    PPRV_Volume(a6),d0
  969.         ifne PPR_MasterVol
  970.             PPR_CALCVOL2    d0
  971.         endc
  972.             move.w    d0,$18(a1)
  973.             lea.l    PPRV_sizeof(a6),a6
  974.     endc
  975.  
  976.     ifge PPR_Channels-3
  977.             move.b    PPRV_Volume(a6),d0
  978.         ifne PPR_MasterVol
  979.             PPR_CALCVOL2    d0
  980.         endc
  981.             move.w    d0,$28(a1)
  982.             lea.l    PPRV_sizeof(a6),a6
  983.     endc
  984.  
  985.     ifge PPR_Channels-4
  986.             move.b    PPRV_Volume(a6),d0
  987.         ifne PPR_MasterVol
  988.             PPR_CALCVOL2    d0
  989.         endc
  990.             move.w    d0,$38(a1)
  991.     endc
  992.     endc
  993.  
  994.         move.b    PPRM_PrePause(a4),PPRM_Speed(a4)
  995.  
  996.         rts
  997.     endc
  998.  
  999. ;------------------------------------------------------------------------------
  1000. ;==                FORWARD/REWIND                     ==
  1001. ;------------------------------------------------------------------------------
  1002.     ifne PPR_WindFuncs
  1003. PPR_Forward    lea.l    PPR_MainData(pc),a4
  1004.  
  1005.         bsr.w    PPR_VoiceClear
  1006.  
  1007.         move.w    #256,PPRM_PatternPos(a4)
  1008.         move.b    PPRM_Speed(a4),PPRM_Counter(a4)
  1009.  
  1010.         moveq.l    #0,d0
  1011.         rts
  1012.  
  1013. PPR_Rewind    lea.l    PPR_MainData(pc),a4
  1014.         bsr.w    PPR_VoiceClear
  1015.  
  1016.         move.b    PPRM_SongPos(a4),d0
  1017.         tst.b    d0
  1018.         bne.s    .not0
  1019.  
  1020.         move.l    PPRM_SongDatPtr(a4),a0
  1021.         move.b    PPRF_Positions(a0),PPRM_SongPos(a4)
  1022.         sub.b    #2,PPRM_SongPos(a4)
  1023.         bra.s    .ok
  1024.  
  1025. .not0        cmp.b    #1,d0
  1026.         bne.s    .not1
  1027.  
  1028.         move.l    PPRM_SongDatPtr(a4),a0
  1029.         move.b    PPRF_Positions(a0),PPRM_SongPos(a4)
  1030.         sub.b    #1,PPRM_SongPos(a4)
  1031.         bra.s    .ok
  1032.  
  1033. .not1        sub.b    #2,PPRM_SongPos(a4)
  1034. .ok        move.w    #256,PPRM_PatternPos(a4)
  1035.         move.b    PPRM_Speed(a4),PPRM_Counter(a4)
  1036.  
  1037.         moveq.l    #0,d0
  1038.         rts
  1039.     endc
  1040.  
  1041. ;------------------------------------------------------------------------------
  1042. ;==                MUSIC                         ==
  1043. ;;-----------------------------------------------------------------------------
  1044. ;A0 - Pattern pointer. (...?)
  1045. ;A1 -
  1046. ;A2 -
  1047. ;A3 -
  1048. ;A4 - Pointer to main-variables
  1049. ;A5 - Pointer to audio-hardware
  1050. ;A6 - Pointer to voice-variables
  1051. ;------------------------------------------------------------------------------
  1052. PPR_Music
  1053.     ifne PPR_NotePlayer
  1054.         bsr.w    PPRN_MakeSound
  1055.     endc
  1056.  
  1057.         lea.l    PPR_MainData(pc),a4
  1058.         addq.b    #1,PPRM_Counter(a4)
  1059.         move.b    PPRM_Speed(a4),d1    ; Module halted?
  1060.         beq.w    PPR_return
  1061.         move.b    PPRM_Counter(a4),d0
  1062.         cmp.b    d1,d0
  1063.         blo.w    PPR_nonewnote
  1064.         clr.b    PPRM_Counter(a4)
  1065.         tst.b    PPRM_PtDelCount(a4)    ; Pattern delayed?
  1066.         beq.w    PPR_getnewnote
  1067.  
  1068.         pea.l    PPR_dskip(pc)
  1069.         bra.w    PPR_nonewallchannels
  1070.  
  1071. PPR_WAIT    macro
  1072.         moveq.l    #\1-1,d0
  1073.         bsr.w    PPR_WaitLines
  1074.         endm
  1075.  
  1076.     ifeq PPR_Level6
  1077. PPR_WaitLines    lea.l    $dff006+1,a1
  1078.         move.b    (a1),d7
  1079.         and.b    #$f0,d7
  1080. .loop1        move.b    (a1),d6
  1081.         and.b    #$f0,d6
  1082.         cmp.b    d7,d6
  1083.         beq.s    .loop1
  1084. .loop2        move.b    (a1),d6
  1085.         and.b    #$f0,d6
  1086.         cmp.b    d7,d6
  1087.         bne.s    .loop2
  1088.         dbf    d0,.loop1
  1089.         rts
  1090.     endc
  1091.  
  1092. PPR_PERNOP    macro
  1093.     ifne PPR_NotePlayer
  1094.         PPRN_SetRate PPRV_CurrPer(a6)
  1095.     else
  1096.         move.w    PPRV_CurrPer(a6),6(a5)
  1097.     endc
  1098.         endm
  1099.  
  1100. PPR_nonewnote    pea.l    PPR_nonewposyet(pc)
  1101.         bra.w    PPR_nonewallchannels
  1102.  
  1103. PPR_nonewallchannels
  1104.         ; Updates effects, and that's basically it.
  1105.  
  1106.     ifeq PPR_NotePlayer
  1107.             lea.l    $dff090,a5
  1108.             lea.l    PPR_VoiceData-PPRV_sizeof(pc),a6
  1109.  
  1110.         ifge PPR_Channels-1
  1111.             ifeq PPR_Channels-1
  1112.                 bra.w    PPR_ChkEfxEvery
  1113.             else
  1114.                 bsr.w    PPR_ChkEfxEvery
  1115.             endc
  1116.         endc
  1117.  
  1118.         ifge PPR_Channels-2
  1119.             ifeq PPR_Channels-2
  1120.                 bra.w    PPR_ChkEfxEvery
  1121.             else
  1122.                 bsr.w    PPR_ChkEfxEvery
  1123.             endc
  1124.         endc
  1125.  
  1126.         ifge PPR_Channels-3
  1127.             ifeq PPR_Channels-3
  1128.                 bra.w    PPR_ChkEfxEvery
  1129.             else
  1130.                 bsr.w    PPR_ChkEfxEvery
  1131.             endc
  1132.         endc
  1133.  
  1134.         ifge PPR_Channels-4
  1135.             ifeq PPR_Channels-4
  1136.                 bra.w    PPR_ChkEfxEvery
  1137.             else
  1138.                 bsr.w    PPR_ChkEfxEvery
  1139.             endc
  1140.         endc
  1141.     else
  1142.             lea.l    PPR_VoiceData-PPRV_sizeof(pc),a6
  1143.  
  1144.         ifge PPR_Channels-1
  1145.             PPRN_InitReg 0
  1146.             ifeq PPR_Channels-1
  1147.                 bra.w    PPR_ChkEfxEvery
  1148.             else
  1149.                 bsr.w    PPR_ChkEfxEvery
  1150.             endc
  1151.         endc
  1152.  
  1153.         ifge PPR_Channels-2
  1154.             PPRN_InitReg 1
  1155.             ifeq PPR_Channels-2
  1156.                 bra.w    PPR_ChkEfxEvery
  1157.             else
  1158.                 bsr.w    PPR_ChkEfxEvery
  1159.             endc
  1160.         endc
  1161.  
  1162.         ifge PPR_Channels-3
  1163.             PPRN_InitReg 2
  1164.             ifeq PPR_Channels-3
  1165.                 bra.w    PPR_ChkEfxEvery
  1166.             else
  1167.                 bsr.w    PPR_ChkEfxEvery
  1168.             endc
  1169.         endc
  1170.  
  1171.         ifge PPR_Channels-4
  1172.             PPRN_InitReg 3
  1173.             ifeq PPR_Channels-4
  1174.                 bra.w    PPR_ChkEfxEvery
  1175.             else
  1176.                 bsr.w    PPR_ChkEfxEvery
  1177.             endc
  1178.         endc
  1179.     endc
  1180.  
  1181.         rts
  1182.  
  1183. PPR_getnewnote    ; Gets new notes for all channels.
  1184.  
  1185.         move.l    PPRM_SongDatPtr(a4),a0
  1186.         move.l    a0,a3
  1187.         lea.l    122(a0),a2    ;pattpo
  1188.         lea.l    762(a0),a0    ;patterndata
  1189.         clr.w    PPRM_DMAConTmp(a4)
  1190.  
  1191.         lea.l    PPR_VoiceData-PPRV_sizeof(pc),a6
  1192.  
  1193.     ifeq PPR_NotePlayer
  1194.         lea.l    $dff090,a5
  1195.  
  1196.         ifgt PPR_Channels-0
  1197.             bsr.s    PPR_dovoice
  1198.         endc
  1199.  
  1200.         ifgt PPR_Channels-1
  1201.             bsr.s    PPR_dovoice
  1202.         endc
  1203.  
  1204.         ifgt PPR_Channels-2
  1205.             bsr.s    PPR_dovoice
  1206.         endc
  1207.  
  1208.         ifgt PPR_Channels-3
  1209.             bsr.s    PPR_dovoice
  1210.         endc
  1211.     else
  1212.         ifgt PPR_Channels-0
  1213.             PPRN_InitReg 0
  1214.             bsr.s    PPR_dovoice
  1215.         endc
  1216.  
  1217.         ifgt PPR_Channels-1
  1218.             PPRN_InitReg 1
  1219.             bsr.s    PPR_dovoice
  1220.         endc
  1221.  
  1222.         ifgt PPR_Channels-2
  1223.             PPRN_InitReg 2
  1224.             bsr.s    PPR_dovoice
  1225.         endc
  1226.  
  1227.         ifgt PPR_Channels-3
  1228.             PPRN_InitReg 3
  1229.             bsr.s    PPR_dovoice
  1230.         endc
  1231.     endc
  1232.  
  1233.         bra.w    PPR_setdma
  1234.  
  1235. PPR_dovoice    ; Fetches next step in pattern and processes it.
  1236.  
  1237.         moveq.l    #0,d0
  1238.         moveq.l    #0,d1
  1239.         move.b    PPRM_SongPos(a4),d0
  1240.         lea.l    128(a2),a2
  1241.         move.b    (a2,d0.w),d1
  1242.         move.w    PPRM_PatternPos(a4),d2
  1243.         lsl    #7,d1            ; *128
  1244.         lsr.w    #1,d2
  1245.         add.w    d2,d1
  1246.  
  1247.     ifeq PPR_NotePlayer
  1248.         lea.l    $10(a5),a5        ; Next audio register
  1249.     endc
  1250.  
  1251.         lea.l    PPRV_sizeof(a6),a6
  1252.  
  1253.         tst.l    PPRV_PatternDat(a6)
  1254.         bne.w    PPR_plvskip
  1255.         PPR_PERNOP
  1256.  
  1257. PPR_plvskip    move.w    (a0,d1.w),d1
  1258.  
  1259.         move.l    PPRM_LwtPtr(a4),a1
  1260.  
  1261.         ; Fetches patterndata
  1262.     ifeq PPR_PreDouble
  1263.         ifeq PPR_68020
  1264.             add.w    d1,d1
  1265.             add.w    d1,d1
  1266.             move.l    (a1,d1.w),PPRV_PatternDat(a6)
  1267.         else
  1268.             move.l    (0,a1,d1.w*4),PPRV_PatternDat(a6)
  1269.         endc
  1270.     else
  1271.         move.l    (a1,d1.w),PPRV_PatternDat(a6); The step-info (as PT!)
  1272.     endc
  1273.  
  1274.     ifeq PPR_PowerPatt
  1275.         move.b    PPRV_PatternDat+2(a6),d2
  1276.         and.l    #$f0,d2
  1277.         lsr.b    #4,d2
  1278.         move.b    PPRV_PatternDat(a6),d0
  1279.         and.b    #$f0,d0
  1280.         or.b    d0,d2
  1281.     else
  1282.         moveq.l    #0,d2
  1283.         move.b    PPRV_PatternDat+1(a6),d2; Instrument number
  1284.     endc
  1285.  
  1286.         beq.b    PPR_setregs        ; Retrig instrument?
  1287.  
  1288.         moveq.l    #0,d3
  1289.         lea.l    PPRM_SamplePtrs(a4),a1
  1290.         subq    #1,d2
  1291.         move    d2,d4
  1292.  
  1293.     ifne PPR_68020
  1294.         move.l    (0,a1,d2.l*4),(PPRV_SamplePtr,a6); Samplepointer
  1295.     else
  1296.         add    d2,d2
  1297.         add    d2,d2
  1298.         move.l    (a1,d2.l),PPRV_SamplePtr(a6)
  1299.     endc
  1300.  
  1301.         lsl.w    #3,d4
  1302.         move.w    PPRFI_Size(a3,d4.w),PPRV_PlaySize(a6)
  1303.         move.w    PPRFI_Finetune(a3,d4.w),PPRV_Finetune(a6)
  1304.         move.l    PPRV_SamplePtr(a6),d2        ; get start
  1305.         move.w    PPRFI_Repeat(a3,d4.w),d3    ; get repeat
  1306.         beq.s    PPR_noloop
  1307.         move.w    d3,d0                ; get repeat
  1308.         add.w    d3,d3
  1309.         add.l    d3,d2                ; add repeat
  1310.         add.w    PPRFI_RepLen(a3,d4.w),d0    ; add replen
  1311.         move.w    d0,PPRV_PlaySize(a6)
  1312.  
  1313. PPR_noloop    move.l    d2,PPRV_LoopStart(a6)
  1314.         move.l    d2,PPRV_FunkPtr(a6)
  1315.         move.w    PPRFI_RepLen(a3,d4.w),PPRV_RepLen(a6)    ; save replen
  1316.  
  1317.     ifeq PPR_NotePlayer
  1318.         ifne PPR_MasterVol
  1319.             PPR_CALCVOL    d0
  1320.         else
  1321.             move.b    PPRV_Volume(a6),9(a5)    ; set volume
  1322.         endc
  1323.     else
  1324.         PPRN_SetVolume PPRV_Volume(a6)
  1325.     endc
  1326.  
  1327. PPR_setregs
  1328.     ifeq PPR_PowerPatt
  1329.         move.w    PPRV_PatternDat(a6),d0
  1330.         and.w    #$0fff,d0
  1331.     else
  1332.         move.b    PPRV_PatternDat(a6),d0
  1333.         and.w    #$00ff,d0
  1334.     endc
  1335.  
  1336.         beq.w    PPR_ChkEfxSometime    ; if no note
  1337.  
  1338.         move.w    PPRV_PatternDat+2(a6),d0; Effectcommands to execute
  1339.                         ; before setting period for
  1340.                         ; new notes.
  1341.  
  1342.     ifne PPR_Finetune
  1343.         and.w    #$0ff0,d0
  1344.         cmp.w    #$0e50,d0
  1345.         beq.s    PPR_dosetfinetune
  1346.     endc
  1347.  
  1348.         and.w    #$0f00,d0
  1349.         cmp.w    #$0300,d0        ; toneportamento
  1350.         beq.s    PPR_chktoneporta
  1351.         cmp.w    #$0500,d0
  1352.         beq.s    PPR_chktoneporta
  1353.         cmp.w    #$0900,d0        ; sample offset
  1354.         bne.s    PPR_setperiod
  1355.  
  1356.         pea.l    PPR_setperiod(pc)
  1357.         bra.w    PPR_ChkEfxSometime
  1358.  
  1359. PPR_chktoneporta
  1360.  
  1361.         pea.l    PPR_ChkEfxSometime(pc)
  1362.         bra.w    PPR_settoneporta
  1363.  
  1364.     ifne PPR_Finetune
  1365. PPR_dosetfinetune
  1366.         bsr.w    PPR_setfinetune
  1367.     endc
  1368.  
  1369. PPR_setperiod    ; Set period for channel.
  1370.  
  1371. ;        movem.l    d1/a1,-(sp)
  1372.  
  1373.     ifeq PPR_PowerPatt
  1374.         move.w    PPRV_PatternDat(a6),d1
  1375.         and.w    #$0fff,d1
  1376.  
  1377.         ifeq PPR_Finetune
  1378.             move.w    d1,PPRV_CurrPer(a6)
  1379.         else
  1380.  
  1381. PPR_setperiod2
  1382.             lea.l    PPR_periodtable(pc),a1
  1383.             moveq.l    #36,d7
  1384. PPR_ftuloop        cmp.w    (a1)+,d1
  1385.             bhs.s    PPR_ftufound
  1386.             dbra    d7,PPR_ftuloop
  1387. PPR_ftufound
  1388.             moveq.l    #0,d1
  1389.             move.b    PPRV_Finetune(a6),d1
  1390.             lsl.l    #7,d1        ; *64*2
  1391.  
  1392.             move.w    -2(a1,d1.w),PPRV_CurrPer(a6)
  1393.         endc
  1394.     else    ; If powerpatterns were enabled...
  1395.         move.b    PPRV_PatternDat(a6),d1
  1396.         and.l    #$00ff,d1
  1397.  
  1398.         ifeq PPR_Finetune
  1399.             lea.l    PPR_periodtable-2(pc),a1
  1400.             move.w    (a1,d1.w),PPRV_CurrPer(a6)
  1401.             move.b    PPRV_PatternDat(a6),PPRV_CurrNote(a6)
  1402.         else
  1403.  
  1404. PPR_setperiod2        move.b    PPRV_PatternDat(a6),PPRV_CurrNote(a6)
  1405.  
  1406.             lea.l    PPR_periodtable-2(pc),a1
  1407. PPR_ftu            moveq.l    #0,d0
  1408.             move.b    PPRV_Finetune(a6),d0    ; Finetune value
  1409.             lsl.l    #7,d0        ; *64*2
  1410.             add.l    d0,a1
  1411.  
  1412.             move.w    (a1,d1.w),PPRV_CurrPer(a6)
  1413.         endc
  1414.     endc
  1415.  
  1416. ;        movem.l    (sp)+,d1/a1
  1417.  
  1418.         move.w    PPRV_PatternDat+2(a6),d0; Effectcommands to execute
  1419.         and.w    #$0ff0,d0        ; after periodsetting for new
  1420.         cmp.w    #$0ed0,d0        ; notes. (notedelay)
  1421.         beq.w    PPR_ChkEfxSometime
  1422.  
  1423.     ifeq PPR_NotePlayer
  1424.         move.w    PPRV_DMAMask(a6),$dff096; Disable DMA for this channel
  1425.         PPR_WAIT 1
  1426.     endc
  1427.  
  1428.         btst    #2,PPRV_Control1(a6)
  1429.         bne.s    PPR_vibnoc
  1430.  
  1431.         clr.b    PPRV_VibCount(a6)
  1432.  
  1433. PPR_vibnoc    btst    #6,PPRV_Control1(a6)
  1434.         bne.s    PPR_trenoc
  1435.         clr.b    PPRV_TremCount(a6)
  1436.  
  1437. PPR_trenoc
  1438.     ifeq PPR_NotePlayer
  1439.         move.l    PPRV_SamplePtr(a6),(a5)        ; set start
  1440.         move.w    PPRV_PlaySize(a6),4(a5)        ; set length
  1441.         move.w    PPRV_CurrPer(a6),6(a5)        ; set period
  1442.         move.w    PPRV_DMAMask(a6),d0
  1443.         or.w    d0,PPRM_DMAConTmp(a4)        ; Order trig of note
  1444.     else
  1445.         PPRN_TrigWave PPRV_SamplePtr(a6),PPRV_PlaySize(a6)
  1446.         PPRN_SetRate PPRV_CurrPer(a6)
  1447.     endc
  1448.         bra.w    PPR_ChkEfxSometime
  1449.  
  1450. PPR_setdma    ; Trig new samples with respect to DMA cycles.
  1451.  
  1452.     ifeq PPR_NotePlayer
  1453.             or.w    #$8000,PPRM_DMAConTmp(a4)
  1454.  
  1455.         ifne PPR_Level6 ;then
  1456.             lea.l    $bfd000,a3
  1457.             move.l    PPRM_VBR(a4),a1
  1458.             move.b    #$7f,$d00(a3)
  1459.             move.w    #$2000,$dff09c
  1460.             move.w    #$a000,$dff09a
  1461.             move.l    $78(a1),PPRM_OldIRQ(a4)
  1462.             lea.l    PPR_irq1(pc),a2
  1463.             move.l    a2,$78(a1)
  1464.             moveq.l    #0,d0
  1465.             move.b    d0,$e00(a3)
  1466.             move.b    #$a8,$400(a3)
  1467.             move.b    d0,$500(a3)
  1468.             move.b    #$11,$e00(a3)
  1469.             move.b    #$81,$d00(a3)
  1470.             bra.w    PPR_dskip
  1471.         else
  1472.             PPR_WAIT 4        ; Wait for auddat to be fetched
  1473.         endc
  1474.  
  1475.         ifne PPR_Level6 ;then
  1476. PPR_irq1        movem.l    a0/a1/a4,-(sp)
  1477.             lea.l    PPR_MainData(pc),a4
  1478.             tst.b    $bfdd00
  1479.             move.w    PPRM_DMAConTmp(a4),$dff096; Reset Paula
  1480.             move.w    #$2000,$dff09c
  1481.  
  1482.             move.l    PPRM_VBR(a4),a0
  1483.             lea.l    PPR_irq2(pc),a1
  1484.             move.l    a1,$78(a0)
  1485.             movem.l    (sp)+,a0/a1/a4
  1486.  
  1487.             rte
  1488.  
  1489.         else
  1490.         move.w    PPRM_DMAConTmp(a4),$dff096; Reset Paula
  1491.             PPR_WAIT 1        ; Wait for DMA to come on
  1492.         endc
  1493.  
  1494.         ifne PPR_Level6 ;then
  1495. PPR_irq2        tst.b    $bfdd00
  1496.             movem.l    a4-a6,-(a7)
  1497.             lea.l    PPR_MainData(pc),a4
  1498.         endc
  1499.  
  1500.         lea.l    $dff0a0,a5
  1501.         lea.l    PPR_VoiceData(pc),a6
  1502.  
  1503.     ifge PPR_Channels-1
  1504.         move.l    (PPRV_sizeof*0)+PPRV_LoopStart(a6),$00(a5)
  1505.         move.w    (PPRV_sizeof*0)+PPRV_RepLen(a6),$04(a5)
  1506.     endc
  1507.     ifge PPR_Channels-2
  1508.         move.l    (PPRV_sizeof*1)+PPRV_LoopStart(a6),$10(a5)
  1509.         move.w    (PPRV_sizeof*1)+PPRV_RepLen(a6),$14(a5)
  1510.     endc
  1511.     ifge PPR_Channels-3
  1512.         move.l    (PPRV_sizeof*2)+PPRV_LoopStart(a6),$20(a5)
  1513.         move.w    (PPRV_sizeof*2)+PPRV_RepLen(a6),$24(a5)
  1514.     endc
  1515.     ifge PPR_Channels-4
  1516.         move.l    (PPRV_sizeof*3)+PPRV_LoopStart(a6),$30(a5)
  1517.         move.w    (PPRV_sizeof*3)+PPRV_RepLen(a6),$34(a5)
  1518.     endc
  1519.  
  1520.         ifne PPR_Level6 ;then
  1521.             move.b    #0,$bfde00
  1522.             move.b    #$7f,$bfdd00
  1523.             move.l    PPRM_VBR(a4),a5
  1524.             move.l    PPRM_OldIRQ(a4),$78(a5)
  1525.             move.w    #$2000,$dff09c
  1526.             movem.l    (a7)+,a4-a6
  1527.             rte
  1528.         endc
  1529.     else
  1530.     ifge PPR_Channels-1
  1531.         lea.l    PPR_VoiceData(pc),a6
  1532.         PPRN_InitReg 0
  1533.         PPRN_SetWave PPRV_LoopStart(a6),PPRV_RepLen(a6)
  1534.     endc
  1535.     ifge PPR_Channels-2
  1536.         PPRN_InitReg 1
  1537.         PPRN_SetWave PPRV_LoopStart(a6),PPRV_RepLen(a6)
  1538.     endc
  1539.     ifge PPR_Channels-3
  1540.         PPRN_InitReg 2
  1541.         PPRN_SetWave PPRV_LoopStart(a6),PPRV_RepLen(a6)
  1542.     endc
  1543.     ifge PPR_Channels-4
  1544.         PPRN_InitReg 3
  1545.         PPRN_SetWave PPRV_LoopStart(a6),PPRV_RepLen(a6)
  1546.     endc
  1547.     endc
  1548.  
  1549. PPR_dskip    ; Do things concerning the next patternstep.
  1550.  
  1551.         addq.w    #4,PPRM_PatternPos(a4)
  1552.         move.b    PPRM_PtDelTime(a4),d0
  1553.         beq.s    PPR_dskc        ; No pending delay...
  1554.  
  1555.         move.b    d0,PPRM_PtDelCount(a4)
  1556.         clr.b    PPRM_PtDelTime(a4)
  1557.  
  1558. PPR_dskc    tst.b    PPRM_PtDelCount(a4)    ; No delaycount...
  1559.         beq.s    PPR_dska
  1560.  
  1561.         subq.b    #1,PPRM_PtDelCount(a4)    ; Sub counter...
  1562.         beq.s    PPR_dska        ; Release pattern...
  1563.  
  1564.         subq.w    #4,PPRM_PatternPos(a4)
  1565.  
  1566. PPR_dska    tst.b    PPRM_PBreakFl(a4)
  1567.         beq.s    PPR_nnpysk
  1568.  
  1569.         sf    PPRM_PBreakFl(a4)
  1570.         moveq.l    #0,d0
  1571.         move.b    PPRM_PBreakPos(a4),d0
  1572.         clr.b    PPRM_PBreakPos(a4)
  1573.         add.w    d0,d0
  1574.         add.w    d0,d0
  1575.         move.w    d0,PPRM_PatternPos(a4)
  1576.  
  1577. PPR_nnpysk    cmp.w    #256,PPRM_PatternPos(a4)
  1578.         blo.s    PPR_nonewposyet
  1579.  
  1580. PPR_nextposition
  1581.         ; Fetches the next position.
  1582.  
  1583.         moveq.l    #0,d0
  1584.         move.b    PPRM_PBreakPos(a4),d0
  1585.         add.w    d0,d0
  1586.         add.w    d0,d0
  1587.         move.w    d0,PPRM_PatternPos(a4)
  1588.         clr.b    PPRM_PBreakPos(a4)
  1589.         clr.b    PPRM_PosJumpFl(a4)
  1590.         addq.b    #1,PPRM_SongPos(a4)
  1591.         and.b    #$7f,PPRM_SongPos(a4)
  1592.         move.b    PPRM_SongPos(a4),d1
  1593.         move.l    PPRM_SongDatPtr(a4),a0
  1594.         cmp.b    PPRF_Positions(a0),d1
  1595.         blo.s    PPR_nonewposyet
  1596.         clr.b    PPRM_SongPos(a4)
  1597.         st.b    PPRM_RestFlag(a4)
  1598.  
  1599. PPR_nonewposyet    tst.b    PPRM_PosJumpFl(a4)
  1600.         bne.s    PPR_nextposition
  1601.  
  1602. PPR_return    rts
  1603.  
  1604. ;------------------------------------------------------------------------------
  1605. ;Effectcommands which needs to be called every frame.
  1606. ;------------------------------------------------------------------------------
  1607.  
  1608. PPR_ChkEfxEvery
  1609.     ifeq PPR_NotePlayer
  1610.         lea.l    $10(a5),a5
  1611.     endc
  1612.  
  1613.         lea.l    PPRV_sizeof(a6),a6
  1614.  
  1615.         tst.b    PPRM_PtDelCount(a4)
  1616.         beq.s    .NoDelay
  1617.  
  1618.         tst.b    PPRM_Counter(a4)
  1619.         bne.s    .NoDelay
  1620.  
  1621.         ; This has to be done in order to manually take care of the
  1622.         ; steps when the pattern is delayed.
  1623.  
  1624.         bsr.s    PPR_ChkEfxSometime
  1625.  
  1626. .NoDelay    bsr.w    PPR_updatefunk
  1627.  
  1628.         move.w    PPRV_PatternDat+2(a6),d0
  1629.         bne.w    .WasEffect
  1630.  
  1631.         PPR_PERNOP
  1632.         rts
  1633.  
  1634. .WasEffect    lsr.w    #8-2,d0            ; Get cmd-byte and *4.
  1635.         and.w    #$f<<2,d0
  1636.         lea.l    PPR_EfxEvery(pc),a1
  1637.         add.l    (a1,d0.w),a1
  1638.         jsr    (a1)
  1639.  
  1640.         rts
  1641.  
  1642. PPR_EfxEvery    dc.l    PPR_arpeggio-PPR_EfxEvery            ; 0
  1643.         dc.l    PPR_portaup-PPR_EfxEvery            ; 1
  1644.         dc.l    PPR_portadown-PPR_EfxEvery            ; 2
  1645.         dc.l    PPR_toneportamento-PPR_EfxEvery            ; 3
  1646.         dc.l    PPR_vibrato-PPR_EfxEvery            ; 4
  1647.         dc.l    PPR_toneplusvolslide-PPR_EfxEvery        ; 5
  1648.         dc.l    PPR_vibratoplusvolslide-PPR_EfxEvery        ; 6
  1649.         dc.l    PPR_tremolo-PPR_EfxEvery            ; 7
  1650.         dc.l    PPR_return-PPR_EfxEvery                ; 8
  1651.         dc.l    PPR_return-PPR_EfxEvery                ; 9
  1652.         dc.l    PPR_volumeslide-PPR_EfxEvery            ; A
  1653.         dc.l    PPR_return-PPR_EfxEvery                ; B
  1654.         dc.l    PPR_return-PPR_EfxEvery                ; C
  1655.         dc.l    PPR_return-PPR_EfxEvery                ; D
  1656.         dc.l    PPR_ChkExtEvery-PPR_EfxEvery            ; Ex
  1657.         dc.l    PPR_return-PPR_EfxEvery                ; F
  1658.  
  1659. ;------------------------------------------------------------------------------
  1660. ;Effectcommands which needs to be called every time a new note is started.
  1661. ;------------------------------------------------------------------------------
  1662.  
  1663. PPR_ChkEfxSometime
  1664.         ; Effectcommands to execute only the first frame...
  1665.  
  1666.         bsr.w    PPR_updatefunk        ; Why here?!?
  1667.  
  1668.         move.b    PPRV_PatternDat+2(a6),d0
  1669.         and.w    #$f,d0
  1670.         lsl.w    #2,d0            ; *4
  1671.         lea.l    PPR_EfxSometime(pc),a1
  1672.         add.l    (a1,d0.w),a1
  1673.         jsr    (a1)
  1674.  
  1675.         PPR_PERNOP            ; Necessary?
  1676.         rts
  1677.  
  1678. PPR_EfxSometime    dc.l    PPR_arpinit-PPR_EfxSometime            ; 0
  1679.         dc.l    PPR_return-PPR_EfxSometime            ; 1
  1680.         dc.l    PPR_return-PPR_EfxSometime            ; 2
  1681.         dc.l    PPR_return-PPR_EfxSometime            ; 3
  1682.         dc.l    PPR_return-PPR_EfxSometime            ; 4
  1683.         dc.l    PPR_return-PPR_EfxSometime            ; 5
  1684.         dc.l    PPR_return-PPR_EfxSometime            ; 6
  1685.         dc.l    PPR_return-PPR_EfxSometime            ; 7
  1686.         dc.l    PPR_syncval-PPR_EfxSometime            ; 8
  1687.         dc.l    PPR_sampleoffset-PPR_EfxSometime        ; 9
  1688.         dc.l    PPR_return-PPR_EfxSometime            ; A
  1689.         dc.l    PPR_positionjump-PPR_EfxSometime        ; B
  1690.         dc.l    PPR_volumechange-PPR_EfxSometime        ; C
  1691.         dc.l    PPR_patternbreak-PPR_EfxSometime        ; D
  1692.         dc.l    PPR_ChkExtSometime-PPR_EfxSometime        ; Ex
  1693.         dc.l    PPR_setspeed-PPR_EfxSometime            ; F
  1694.  
  1695. ;------------------------------------------------------------------------------
  1696. ;Extended effectcommands called each frame.
  1697. ;------------------------------------------------------------------------------
  1698.  
  1699. PPR_ChkExtEvery
  1700.         ; Extended effectcommands called each frame...
  1701.  
  1702.         move.b    PPRV_PatternDat+3(a6),d0
  1703.         lsr.w    #4-2,d0            ; *4
  1704.         and.w    #$f<<2,d0
  1705.         lea.l    PPR_ExtEvery(pc),a1
  1706.         add.l    (a1,d0.w),a1
  1707.         jsr    (a1)
  1708.  
  1709.         rts
  1710.  
  1711. PPR_ExtEvery    dc.l    PPR_return-PPR_ExtEvery                ; 0
  1712.         dc.l    PPR_return-PPR_ExtEvery                ; 1
  1713.         dc.l    PPR_return-PPR_ExtEvery                ; 2
  1714.         dc.l    PPR_return-PPR_ExtEvery                ; 3
  1715.         dc.l    PPR_return-PPR_ExtEvery                ; 4
  1716.     ifne PPR_Finetune
  1717.         dc.l    PPR_setfinetune-PPR_ExtEvery            ; 5
  1718.     else
  1719.         dc.l    PPR_return-PPR_ExtEvery                ; 5
  1720.     endc
  1721.         dc.l    PPR_return-PPR_ExtEvery                ; 6
  1722.         dc.l    PPR_return-PPR_ExtEvery                ; 7
  1723.         dc.l    PPR_return-PPR_ExtEvery                ; 8
  1724.         dc.l    PPR_retrignote-PPR_ExtEvery            ; 9
  1725.         dc.l    PPR_return-PPR_ExtEvery                ; A
  1726.         dc.l    PPR_return-PPR_ExtEvery                ; B
  1727.         dc.l    PPR_notecut-PPR_ExtEvery            ; C
  1728.         dc.l    PPR_notedelay-PPR_ExtEvery            ; D
  1729.         dc.l    PPR_return-PPR_ExtEvery                ; E
  1730.         dc.l    PPR_return-PPR_ExtEvery                ; F
  1731.  
  1732. ;------------------------------------------------------------------------------
  1733. ;Extended effectcommands are called each frame.
  1734. ;------------------------------------------------------------------------------
  1735.  
  1736. PPR_ChkExtSometime
  1737.         ; Extended effectcommands called only the first frame...
  1738.  
  1739.         move.b    PPRV_PatternDat+3(a6),d0
  1740.         lsr.w    #4-2,d0            ; *4
  1741.         and.w    #$f<<2,d0
  1742.         lea.l    PPR_ExtSometime(pc),a1
  1743.         add.l    (a1,d0.w),a1
  1744.         jsr    (a1)
  1745.  
  1746.         rts
  1747.  
  1748. PPR_ExtSometime    dc.l    PPR_filteronoff-PPR_ExtSometime            ; 0
  1749.         dc.l    PPR_fineportaup-PPR_ExtSometime            ; 1
  1750.         dc.l    PPR_fineportadown-PPR_ExtSometime        ; 2
  1751.         dc.l    PPR_setglissctrl-PPR_ExtSometime        ; 3
  1752.         dc.l    PPR_setvibratoctrl-PPR_ExtSometime        ; 4
  1753.         dc.l    PPR_return-PPR_ExtSometime            ; 5
  1754.         dc.l    PPR_PatternLoop-PPR_ExtSometime            ; 6
  1755.         dc.l    PPR_settremoloctrl-PPR_ExtSometime        ; 7
  1756.         dc.l    PPR_return-PPR_ExtSometime            ; 8
  1757.         dc.l    PPR_return-PPR_ExtSometime            ; 9
  1758.         dc.l    PPR_volumefineup-PPR_ExtSometime        ; A
  1759.         dc.l    PPR_volumefinedown-PPR_ExtSometime        ; B
  1760.         dc.l    PPR_return-PPR_ExtSometime            ; C
  1761.         dc.l    PPR_return-PPR_ExtSometime            ; D
  1762.         dc.l    PPR_patterndelay-PPR_ExtSometime        ; E
  1763.         dc.l    PPR_funkit-PPR_ExtSometime            ; F
  1764.  
  1765. ;------------------------------------------------------------------------------
  1766. ; 0  - ARPEGGIO
  1767. ;------------------------------------------------------------------------------
  1768.  
  1769. PPR_arpinit    move.b    #0,PPRV_ArpCount(a6)    ; Clear arpeggio count
  1770.         rts
  1771.  
  1772. PPR_arpeggio    moveq.l    #0,d0
  1773.         move.b    PPRV_ArpCount(a6),d0
  1774.         move.b    d0,d1
  1775.         add.b    #1,d1
  1776.         cmp.b    #3,d1
  1777.         bne.s    .OkCount
  1778.  
  1779.         moveq.l    #0,d1
  1780. .OkCount    move.b    d1,PPRV_ArpCount(a6)
  1781.  
  1782.         tst.w    d0
  1783.         beq.s    PPR_arpeggio0
  1784.  
  1785.         subq    #2,d0
  1786.         beq.s    PPR_arpeggio2
  1787.  
  1788.         moveq.l    #0,d0            ; first value
  1789.         move.b    PPRV_PatternDat+3(a6),d0
  1790.         lsr.b    #4,d0
  1791.         bra.s    PPR_doarp
  1792.  
  1793. PPR_arpeggio0    move.w    PPRV_CurrPer(a6),6(a5)        ; zero arpeggio
  1794.         rts
  1795.  
  1796. PPR_arpeggio2    move.b    PPRV_PatternDat+3(a6),d0; last value
  1797.         and.w    #$0f,d0
  1798.  
  1799. PPR_doarp    add.w    d0,d0
  1800.  
  1801.     ifeq PPR_PowerPatt
  1802.             lea.l    PPR_periodtable(pc),a1
  1803.  
  1804.         ifne PPR_Finetune
  1805.             moveq.l    #0,d1
  1806.             move.b    PPRV_Finetune(a6),d1
  1807.             lsl.l    #7,d1        ; *64*2
  1808.             add.l    d1,a1
  1809.         endc
  1810.  
  1811.         move.w    PPRV_CurrPer(a6),d1
  1812.         moveq.l    #36,d7
  1813. PPR_arploop    cmp.w    (a1)+,d1        ; <- This sucks!!!
  1814.         bhs.s    PPR_arpeggio4        ; HIGHER or same?
  1815.         dbra    d7,PPR_arploop
  1816.         rts
  1817.  
  1818. PPR_arpeggio4
  1819.         ifeq PPR_NotePlayer
  1820.             move.w    -2(a1,d0.w),6(a5)    ; Fetch arpvalue...
  1821.         else
  1822.             PPRN_SetRate -2(a1,d0.w)
  1823.         endc
  1824.     else        ; If Powerpatterns were enabled
  1825.         lea.l    PPR_periodtable-2(pc),a1
  1826.  
  1827.         ifne PPR_Finetune
  1828.             moveq.l    #0,d1
  1829.             move.b    PPRV_Finetune(a6),d1
  1830.             lsl.l    #7,d1        ; *64*2
  1831.             add.l    d1,a1
  1832.         endc
  1833.  
  1834.         moveq.l    #0,d1
  1835.         add.b    PPRV_CurrNote(a6),d0
  1836. PPR_arploop
  1837.         ifeq PPR_NotePlayer
  1838.             move.w    (a1,d0.w),6(a5)    ; Fetch arpvalue...
  1839.         else
  1840.             PPRN_SetRate (a1,d0.w)
  1841.         endc
  1842.     endc
  1843.         rts
  1844.  
  1845. ;------------------------------------------------------------------------------
  1846. ; E1 - FINEPORTAMENTO UP
  1847. ;------------------------------------------------------------------------------
  1848.  
  1849. PPR_fineportaup    move.b    #$0f,PPRM_LowMask(a4)    ; Tell where argument is
  1850.  
  1851. ;------------------------------------------------------------------------------
  1852. ; 1  - PORTAMENTO UP
  1853. ;------------------------------------------------------------------------------
  1854.  
  1855. PPR_portaup    moveq.l    #0,d0
  1856.         move.b    PPRV_PatternDat+3(a6),d0
  1857.         and.b    PPRM_LowMask(a4),d0
  1858.         move.b    #$ff,PPRM_LowMask(a4)
  1859.         sub.w    d0,PPRV_CurrPer(a6)
  1860.         move.w    PPRV_CurrPer(a6),d0
  1861.         and.w    #$0fff,d0
  1862.         cmp.w    #113,d0
  1863.         bpl.s    PPR_portauskip
  1864.         and.w    #$f000,PPRV_CurrPer(a6)
  1865.         or.w    #113,PPRV_CurrPer(a6)
  1866.  
  1867. PPR_portauskip    move.w    PPRV_CurrPer(a6),d0
  1868.         and.w    #$0fff,d0
  1869.  
  1870.     ifeq PPR_NotePlayer
  1871.         move.w    d0,6(a5)
  1872.     else
  1873.         PPRN_SetRate d0
  1874.     endc
  1875.  
  1876.         rts
  1877.  
  1878. ;------------------------------------------------------------------------------
  1879. ; E2 - FINEPORTAMENTO DOWN
  1880. ;------------------------------------------------------------------------------
  1881.  
  1882. PPR_fineportadown
  1883.         move.b    #$0f,PPRM_LowMask(a4)
  1884.  
  1885. ;------------------------------------------------------------------------------
  1886. ; 2  - PORTAMENTO DOWN
  1887. ;------------------------------------------------------------------------------
  1888.  
  1889. PPR_portadown    moveq.l    #0,d0
  1890.         move.b    PPRV_PatternDat+3(a6),d0
  1891.         and.b    PPRM_LowMask(a4),d0
  1892.         move.b    #$ff,PPRM_LowMask(a4)
  1893.         add.w    d0,PPRV_CurrPer(a6)
  1894.         move.w    PPRV_CurrPer(a6),d0
  1895.         and.w    #$0fff,d0
  1896.         cmp.w    #856,d0
  1897.         bmi.s    PPR_portadskip
  1898.         and.w    #$f000,PPRV_CurrPer(a6)
  1899.         or.w    #856,PPRV_CurrPer(a6)
  1900.  
  1901. PPR_portadskip    move.w    PPRV_CurrPer(a6),d0
  1902.         and.w    #$0fff,d0
  1903.  
  1904.     ifeq PPR_NotePlayer
  1905.         move.w    d0,6(a5)
  1906.     else
  1907.         PPRN_SetRate d0
  1908.     endc
  1909.  
  1910.         rts
  1911.  
  1912. ;------------------------------------------------------------------------------
  1913. ; 3  - TONEPORTAMENTO
  1914. ;------------------------------------------------------------------------------
  1915.  
  1916.     ifeq PPR_PowerPatt
  1917. PPR_settoneporta
  1918. ;        movem.l    a0,-(sp)
  1919.         move.w    PPRV_PatternDat(a6),d2
  1920.         and.w    #$0fff,d2
  1921.         lea.l    PPR_periodtable(pc),a1
  1922.  
  1923.         ifne PPR_Finetune
  1924.             moveq.l    #0,d0
  1925.             move.b    PPRV_Finetune(a6),d0
  1926.             lsl.l    #7,d0    ; *64*2
  1927.             add.l    d0,a1
  1928.         endc
  1929.  
  1930.         moveq.l    #0,d0
  1931. PPR_stploop    cmp.w    (a1,d0.w),d2        ; I hate these loops!
  1932.         bhs.s    PPR_stpfound
  1933.         addq    #2,d0
  1934.         cmp.w    #37*2,d0
  1935.         blo.s    PPR_stploop
  1936.         moveq.l    #35*2,d0
  1937.  
  1938. PPR_stpfound    btst    #3,PPRV_Finetune(a6)
  1939.         beq.s    PPR_stpgoss
  1940.         tst.w    d0
  1941.         beq.s    PPR_stpgoss
  1942.         subq    #2,d0
  1943. PPR_stpgoss    move.w    (a1,d0.w),d2
  1944. ;        move.l    (sp)+,a0
  1945.         move.w    d2,PPRV_TPDest(a6)
  1946.         move.w    PPRV_CurrPer(a6),d0
  1947.         clr.b    PPRV_TPDir(a6)
  1948.         cmp.w    d0,d2
  1949.         beq.s    PPR_cleartoneporta
  1950.         bge.w    PPR_return
  1951.         move.b    #1,PPRV_TPDir(a6)
  1952.         rts
  1953.  
  1954. PPR_cleartoneporta
  1955.         clr.w    PPRV_TPDest(a6)
  1956.         rts
  1957.  
  1958. PPR_toneportamento
  1959.         move.b    PPRV_PatternDat+3(a6),d0
  1960.         beq.s    PPR_toneportnochange
  1961.         move.b    d0,PPRV_TPPara(a6)
  1962.         clr.b    PPRV_PatternDat+3(a6)
  1963. PPR_toneportnochange
  1964.         tst.w    PPRV_TPDest(a6)
  1965.         beq.w    PPR_return
  1966.         moveq.l    #0,d0
  1967.         move.b    PPRV_TPPara(a6),d0
  1968.         tst.b    PPRV_TPDir(a6)
  1969.         bne.s    PPR_toneportaup
  1970. PPR_toneportadown
  1971.         add.w    d0,PPRV_CurrPer(a6)
  1972.         move.w    PPRV_TPDest(a6),d0
  1973.         cmp.w    PPRV_CurrPer(a6),d0
  1974.         bgt.s    PPR_toneportasetper
  1975.         move.w    PPRV_TPDest(a6),PPRV_CurrPer(a6)
  1976.         clr.w    PPRV_TPDest(a6)
  1977.         bra.s    PPR_toneportasetper
  1978.  
  1979. PPR_toneportaup
  1980.         sub.w    d0,PPRV_CurrPer(a6)
  1981.         move.w    PPRV_TPDest(a6),d0
  1982.         cmp.w    PPRV_CurrPer(a6),d0
  1983.         blt.s    PPR_toneportasetper
  1984.         move.w    PPRV_TPDest(a6),PPRV_CurrPer(a6)
  1985.         clr.w    PPRV_TPDest(a6)
  1986.  
  1987. PPR_toneportasetper
  1988.         move.w    PPRV_CurrPer(a6),d2
  1989.         move.b    PPRV_Control2(a6),d0
  1990.         and.b    #$0f,d0
  1991.         beq.s    PPR_glissskip
  1992.         lea.l    PPR_periodtable(pc),a1
  1993.  
  1994.         ifne PPR_Finetune
  1995.             moveq.l    #0,d0
  1996.             move.b    PPRV_Finetune(a6),d0
  1997.             lsl.l    #7,d0
  1998.             add.l    d0,a1
  1999.         endc
  2000.  
  2001.         moveq.l    #0,d0
  2002. PPR_glissloop    cmp.w    (a1,d0.w),d2        ; More loops!?!
  2003.         bhs.s    PPR_glissfound
  2004.         addq    #2,d0
  2005.         cmp.w    #36*2,d0
  2006.         blo.s    PPR_glissloop
  2007.         moveq.l    #35*2,d0
  2008. PPR_glissfound
  2009.         move.w    (a1,d0.w),d2
  2010. PPR_glissskip
  2011.         ifeq PPR_NotePlayer
  2012.             move.w    d2,6(a5) ; set period
  2013.         else
  2014.             PPRN_SetRate d2
  2015.         endc
  2016.  
  2017.         rts
  2018.  
  2019.     else    ; If powerpatterns were enabled...
  2020. PPR_settoneporta
  2021. ;        movem.l    a0,-(sp)
  2022.         move.b    PPRV_PatternDat(a6),d2
  2023.         and.w    #$00ff,d2
  2024.         lea.l    PPR_periodtable-2(pc),a1
  2025.  
  2026.         ifne PPR_Finetune
  2027.             moveq.l    #0,d0
  2028.             move.b    PPRV_Finetune(a6),d0
  2029.             lsl.l    #7,d0        ; *64*2
  2030.             add.l    d0,a1
  2031.         endc
  2032.  
  2033. PPR_stp        move.w    (a1,d2.w),d2
  2034.  
  2035.         btst    #3,PPRV_Finetune(a6)
  2036.         beq.s    PPR_stpgoss
  2037.         tst.w    d0
  2038.         beq.s    PPR_stpgoss
  2039.         subq    #2,d0
  2040. PPR_stpgoss
  2041. ;        move.l    (sp)+,a0
  2042.         move.w    d2,PPRV_TPDest(a6)
  2043.         move.w    PPRV_CurrPer(a6),d0
  2044.         clr.b    PPRV_TPDir(a6)
  2045.         cmp.w    d0,d2
  2046.         beq.s    PPR_cleartoneporta
  2047.         bge.w    PPR_return
  2048.         move.b    #1,PPRV_TPDir(a6)
  2049.         rts
  2050.  
  2051. PPR_cleartoneporta
  2052.         clr.w    PPRV_TPDest(a6)
  2053.         rts
  2054.  
  2055. PPR_toneportamento
  2056.         move.b    PPRV_PatternDat+3(a6),d0
  2057.         beq.s    PPR_toneportnochange
  2058.         move.b    d0,PPRV_TPPara(a6)
  2059.         clr.b    PPRV_PatternDat+3(a6)
  2060. PPR_toneportnochange
  2061.         tst.w    PPRV_TPDest(a6)
  2062.         beq.w    PPR_return
  2063.         moveq.l    #0,d0
  2064.         move.b    PPRV_TPPara(a6),d0
  2065.         tst.b    PPRV_TPDir(a6)
  2066.         bne.s    PPR_toneportaup
  2067. PPR_toneportadown
  2068.         add.w    d0,PPRV_CurrPer(a6)
  2069.         move.w    PPRV_TPDest(a6),d0
  2070.         cmp.w    PPRV_CurrPer(a6),d0
  2071.         bgt.s    PPR_toneportasetper
  2072.         move.w    PPRV_TPDest(a6),PPRV_CurrPer(a6)
  2073.         clr.w    PPRV_TPDest(a6)
  2074.         bra.s    PPR_toneportasetper
  2075.  
  2076. PPR_toneportaup
  2077.         sub.w    d0,PPRV_CurrPer(a6)
  2078.         move.w    PPRV_TPDest(a6),d0
  2079.         cmp.w    PPRV_CurrPer(a6),d0
  2080.         blt.s    PPR_toneportasetper
  2081.         move.w    PPRV_TPDest(a6),PPRV_CurrPer(a6)
  2082.         clr.w    PPRV_TPDest(a6)
  2083.  
  2084. PPR_toneportasetper
  2085.         move.w    PPRV_CurrPer(a6),d2
  2086.         move.b    PPRV_Control2(a6),d0
  2087.         and.b    #$0f,d0
  2088.         beq.s    PPR_glissskip
  2089.  
  2090.         lea.l    PPR_periodtable(pc),a1
  2091.  
  2092.         ifne PPR_Finetune
  2093.             moveq.l    #0,d0
  2094.             move.b    PPRV_Finetune(a6),d0
  2095.             lsl.l    #7,d0
  2096.             add.l    d0,a1
  2097.         endc
  2098.  
  2099.         moveq.l    #0,d0
  2100. PPR_glissloop    cmp.w    (a1,d0.w),d2        ; I hate loops!
  2101.         bhs.s    PPR_glissfound
  2102.         addq.l    #2,d0
  2103.         cmp.w    #36*2,d0
  2104.         blo.s    PPR_glissloop
  2105.         moveq.l    #35*2,d0
  2106.  
  2107. PPR_glissfound    move.w    (a1,d0.w),d2
  2108.  
  2109. PPR_glissskip
  2110.         ifeq PPR_NotePlayer
  2111.             move.w    d2,6(a5) ; set period
  2112.         else
  2113.             PPRN_SetRate d2
  2114.         endc
  2115.  
  2116.         rts
  2117.     endc
  2118.  
  2119. ;------------------------------------------------------------------------------
  2120. ; 4  - VIBRATO
  2121. ;------------------------------------------------------------------------------
  2122.  
  2123. PPR_vibrato    move.b    PPRV_PatternDat+3(a6),d0
  2124.         beq.s    PPR_vibrato2
  2125.         move.b    PPRV_VibPara(a6),d2
  2126.         and.b    #$0f,d0
  2127.         beq.s    PPR_vibskip
  2128.         and.b    #$f0,d2
  2129.         or.b    d0,d2
  2130. PPR_vibskip
  2131.         move.b    PPRV_PatternDat+3(a6),d0
  2132.         and.b    #$f0,d0
  2133.         beq.s    PPR_vibskip2
  2134.         and.b    #$0f,d2
  2135.         or.b    d0,d2
  2136. PPR_vibskip2
  2137.         move.b    d2,PPRV_VibPara(a6)
  2138. PPR_vibrato2
  2139.         move.b    PPRV_VibCount(a6),d0
  2140.         lea.l    PPR_vibratotable(pc),a1
  2141.         lsr.w    #2,d0
  2142.         and.w    #$001f,d0
  2143.         move.b    PPRV_Control1(a6),d2
  2144.         and.w    #$03,d2
  2145.         beq.s    PPR_vib_sine
  2146.         lsl.b    #3,d0
  2147.         cmp.b    #1,d2
  2148.         beq.s    PPR_vib_rampdown
  2149.     moveq.l    #127,d2
  2150.     or.b    #$80,d2
  2151.         bra.s    PPR_vib_set
  2152. PPR_vib_rampdown
  2153.         tst.b    PPRV_VibCount(a6)
  2154.         bpl.s    PPR_vib_rampdown2
  2155.     moveq.l    #127,d0
  2156.     or.b    #$80,d0
  2157.         sub.b    d0,d2
  2158.         bra.s    PPR_vib_set
  2159. PPR_vib_rampdown2
  2160.         move.b    d0,d2
  2161.         bra.s    PPR_vib_set
  2162. PPR_vib_sine
  2163.         move.b    0(a1,d0.w),d2
  2164. PPR_vib_set
  2165.         move.b    PPRV_VibPara(a6),d0
  2166.         and.w    #15,d0
  2167.         mulu    d0,d2
  2168.         lsr.w    #7,d2
  2169.         move.w    PPRV_CurrPer(a6),d0
  2170.         tst.b    PPRV_VibCount(a6)
  2171.         bmi.s    PPR_vibratoneg
  2172.         add.w    d2,d0
  2173.         bra.s    PPR_vibrato3
  2174. PPR_vibratoneg
  2175.         sub.w    d2,d0
  2176. PPR_vibrato3
  2177.     ifeq PPR_NotePlayer
  2178.         move.w    d0,6(a5)
  2179.     else
  2180.         PPRN_SetRate d0
  2181.     endc
  2182.  
  2183.         move.b    PPRV_VibPara(a6),d0
  2184.         lsr.w    #2,d0
  2185.         and.w    #$003c,d0
  2186.         add.b    d0,PPRV_VibCount(a6)
  2187.         rts
  2188.  
  2189. ;------------------------------------------------------------------------------
  2190. ; 5  - TONEPORTAMENTO + VOLUMESLIDE
  2191. ;------------------------------------------------------------------------------
  2192.  
  2193. PPR_toneplusvolslide
  2194.         pea.l    PPR_volumeslide(pc)
  2195.         bra.w    PPR_toneportnochange
  2196.  
  2197. ;------------------------------------------------------------------------------
  2198. ; 6  - VIBRATO + VOLUMESLIDE
  2199. ;------------------------------------------------------------------------------
  2200.  
  2201. PPR_vibratoplusvolslide
  2202.         pea.l    PPR_volumeslide(pc)
  2203.         bra.w    PPR_vibrato2
  2204.  
  2205. ;------------------------------------------------------------------------------
  2206. ; 7  - TREMOLO
  2207. ;------------------------------------------------------------------------------
  2208.  
  2209. PPR_tremolo    move.b    PPRV_PatternDat+3(a6),d0
  2210.         beq.s    PPR_tremolo2
  2211.         move.b    PPRV_TremPara(a6),d2
  2212.         and.b    #$0f,d0
  2213.         beq.s    PPR_treskip
  2214.         and.b    #$f0,d2
  2215.         or.b    d0,d2
  2216. PPR_treskip
  2217.         move.b    PPRV_PatternDat+3(a6),d0
  2218.         and.b    #$f0,d0
  2219.         beq.s    PPR_treskip2
  2220.         and.b    #$0f,d2
  2221.         or.b    d0,d2
  2222. PPR_treskip2
  2223.         move.b    d2,PPRV_TremPara(a6)
  2224. PPR_tremolo2
  2225.         move.b    PPRV_TremCount(a6),d0
  2226.         lea.l    PPR_vibratotable(pc),a1
  2227.         lsr.w    #2,d0
  2228.         and.w    #$001f,d0
  2229.         moveq.l    #0,d2
  2230.         move.b    PPRV_Control1(a6),d2
  2231.         lsr.b    #4,d2
  2232.         and.b    #$03,d2
  2233.         beq.s    PPR_tre_sine
  2234.         lsl.b    #3,d0
  2235.         cmp.b    #1,d2
  2236.         beq.s    PPR_tre_rampdown
  2237.     moveq.l    #127,d2
  2238.     or.b    #$80,d2
  2239.         bra.s    PPR_tre_set
  2240. PPR_tre_rampdown
  2241.         tst.b    PPRV_VibCount(a6)
  2242.         bpl.s    PPR_tre_rampdown2
  2243.     moveq.l    #127,d2
  2244.     or.b    #$80,d2
  2245.         sub.b    d0,d2
  2246.         bra.s    PPR_tre_set
  2247. PPR_tre_rampdown2
  2248.         move.b    d0,d2
  2249.         bra.s    PPR_tre_set
  2250. PPR_tre_sine
  2251.         move.b    0(a1,d0.w),d2
  2252. PPR_tre_set
  2253.         move.b    PPRV_TremPara(a6),d0
  2254.         and.w    #15,d0
  2255.         mulu    d0,d2
  2256.         lsr.w    #6,d2
  2257.         moveq.l    #0,d0
  2258.         move.b    PPRV_Volume(a6),d0
  2259.         tst.b    PPRV_TremCount(a6)
  2260.         bmi.s    PPR_tremoloneg
  2261.         add.w    d2,d0
  2262.         bra.s    PPR_tremolo3
  2263. PPR_tremoloneg
  2264.         sub.w    d2,d0
  2265. PPR_tremolo3
  2266.         bpl.s    PPR_tremoloskip
  2267.         moveq.l    #0,d0
  2268. PPR_tremoloskip
  2269.         cmp.w    #$40,d0
  2270.         bls.s    PPR_tremolook
  2271.         moveq.l    #$40,d0
  2272. PPR_tremolook
  2273.  
  2274.     ifeq PPR_NotePlayer
  2275.         ifne PPR_MasterVol
  2276.             PPR_CALCVOL2    d0
  2277.         else
  2278.             move.w    d0,9(a5)
  2279.         endc
  2280.     else
  2281.         PPRN_SetVolume d0
  2282.     endc
  2283.  
  2284.         move.b    PPRV_TremPara(a6),d0
  2285.         lsr.w    #2,d0
  2286.         and.w    #$003c,d0
  2287.         add.b    d0,PPRV_TremCount(a6)
  2288.         rts
  2289.  
  2290. ;------------------------------------------------------------------------------
  2291. ; 8  - SYNC VALUE
  2292. ;------------------------------------------------------------------------------
  2293.  
  2294. PPR_syncval    move.b    PPRV_PatternDat+3(a6),PPRM_Msg(a4)
  2295.         rts
  2296.  
  2297. ;------------------------------------------------------------------------------
  2298. ; 9  - SAMPLE OFFSET
  2299. ;------------------------------------------------------------------------------
  2300.  
  2301. PPR_sampleoffset
  2302.         moveq.l    #0,d0
  2303.         move.b    PPRV_PatternDat+3(a6),d0
  2304.         beq.s    PPR_sononew
  2305.         move.b    d0,PPRV_SOffsPara(a6)
  2306.  
  2307. PPR_sononew    move.b    PPRV_SOffsPara(a6),d0
  2308.         lsl.w    #7,d0
  2309.         cmp.w    PPRV_PlaySize(a6),d0
  2310.         bge.s    PPR_sofskip
  2311.         sub.w    d0,PPRV_PlaySize(a6)
  2312.         add.w    d0,d0
  2313.         add.l    d0,PPRV_SamplePtr(a6)
  2314.         rts
  2315. PPR_sofskip
  2316.         move.w    #$0001,PPRV_PlaySize(a6)
  2317.         rts
  2318.  
  2319. ;------------------------------------------------------------------------------
  2320. ; A  - VOLUME SLIDE
  2321. ;------------------------------------------------------------------------------
  2322.  
  2323. PPR_volumeslide    moveq.l    #0,d0
  2324.         move.b    PPRV_PatternDat+3(a6),d0
  2325.         lsr.b    #4,d0
  2326.         tst.b    d0
  2327.         beq.s    PPR_volslidedown
  2328. PPR_volslideup
  2329.         add.b    d0,PPRV_Volume(a6)
  2330.         cmp.b    #$40,PPRV_Volume(a6)
  2331.         bmi.s    PPR_vsuskip
  2332.         move.b    #$40,PPRV_Volume(a6)
  2333. PPR_vsuskip
  2334.     ifeq PPR_NotePlayer
  2335.         ifne PPR_MasterVol
  2336.             PPR_CALCVOL    d0
  2337.         else
  2338.             move.b    PPRV_Volume(a6),9(a5)
  2339.         endc
  2340.     else
  2341.         PPRN_SetVolume PPRV_Volume(a6)
  2342.     endc
  2343.  
  2344.         rts
  2345.  
  2346. PPR_volslidedown
  2347.         move.b    PPRV_PatternDat+3(a6),d0
  2348.         and.w    #$0f,d0
  2349. PPR_volslidedown2
  2350.         sub.b    d0,PPRV_Volume(a6)
  2351.         bpl.s    PPR_vsdskip
  2352.         clr.b    PPRV_Volume(a6)
  2353. PPR_vsdskip
  2354.     ifeq PPR_NotePlayer
  2355.         ifne PPR_MasterVol
  2356.             PPR_CALCVOL    d0
  2357.         else
  2358.             move.b    PPRV_Volume(a6),9(a5)
  2359.         endc
  2360.     else
  2361.         PPRN_SetVolume PPRV_Volume(a6)
  2362.     endc
  2363.         rts
  2364.  
  2365. ;------------------------------------------------------------------------------
  2366. ; B  - POSITION JUMP
  2367. ;------------------------------------------------------------------------------
  2368.  
  2369. PPR_positionjump
  2370.         move.b    PPRV_PatternDat+3(a6),d0
  2371.         subq    #1,d0
  2372.         move.b    d0,PPRM_SongPos(a4)
  2373.         st.b    PPRM_RestFlag(a4)
  2374. PPR_pj2        clr.b    PPRM_PBreakPos(a4)
  2375.         st     PPRM_PosJumpFl(a4)
  2376.         rts
  2377.  
  2378. ;------------------------------------------------------------------------------
  2379. ; C  - SET VOLUME
  2380. ;------------------------------------------------------------------------------
  2381.  
  2382. PPR_volumechange
  2383.         move.b    PPRV_PatternDat+3(a6),d0
  2384.         cmp.b    #$40,d0
  2385.         bls.s    PPR_volumeok
  2386.         moveq.l    #$40,d0
  2387. PPR_volumeok
  2388.         move.b    d0,PPRV_Volume(a6)        ; Store volume
  2389.  
  2390.     ifeq PPR_NotePlayer
  2391.         ifne PPR_MasterVol
  2392.             PPR_CALCVOL2    d0
  2393.         else
  2394.             move.b    d0,9(a5)
  2395.         endc
  2396.     else
  2397.         PPRN_SetVolume d0
  2398.     endc
  2399.  
  2400.         rts
  2401.  
  2402. ;------------------------------------------------------------------------------
  2403. ; D  - PATTERN BREAK
  2404. ;------------------------------------------------------------------------------
  2405.  
  2406. PPR_patternbreak
  2407.         moveq.l    #0,d0
  2408.         move.b    PPRV_PatternDat+3(a6),d0
  2409.         move.w    d0,d2
  2410.         lsr.b    #4,d0
  2411.         add    d0,d0
  2412.         move    d0,d1
  2413.         add    d0,d0
  2414.         add    d0,d0
  2415.         add    d1,d0
  2416.         and.b    #$0f,d2
  2417.         add.b    d2,d0
  2418.         cmp.b    #63,d0
  2419.         bhi.s    PPR_pj2
  2420.         move.b    d0,PPRM_PBreakPos(a4)
  2421.         st    PPRM_PosJumpFl(a4)
  2422.         rts
  2423.  
  2424. ;------------------------------------------------------------------------------
  2425. ; F  - SET SPEED
  2426. ;------------------------------------------------------------------------------
  2427.  
  2428. PPR_setspeed    move.b    PPRV_PatternDat+3(a6),d0
  2429.         bne.s    .NotHalt
  2430.  
  2431.         st.b    PPRM_RestFlag(a4)
  2432.  
  2433. .NotHalt    clr.b    PPRM_Counter(a4)
  2434.     ifne PPR_CIA
  2435.         cmp.b    #32,d0
  2436.         bhs.s    CIA_SetBPM
  2437.  
  2438.     endc
  2439.         move.b    d0,PPRM_Speed(a4)
  2440.         rts
  2441.  
  2442. ;------------------------------------------------------------------------------
  2443. ; E0 - SET FILTER
  2444. ;------------------------------------------------------------------------------
  2445.  
  2446. PPR_filteronoff    move.b    PPRV_PatternDat+3(a6),d0
  2447.  
  2448.     ifeq PPR_NotePlayer
  2449.         and.b    #1,d0
  2450.         bne.s    .Set
  2451.  
  2452. .Clr        and.b    #~2,$bfe001
  2453.         rts
  2454.  
  2455. .Set        or.b    #2,$bfe001
  2456.     else
  2457.         PPRN_Filter d0
  2458.     endc
  2459.  
  2460.         rts
  2461.  
  2462. ;------------------------------------------------------------------------------
  2463. ; E3 - GLISSANDO CONTROL
  2464. ;------------------------------------------------------------------------------
  2465.  
  2466. PPR_setglissctrl
  2467.         move.b    PPRV_PatternDat+3(a6),d0
  2468.         and.b    #$0f,d0
  2469.         and.b    #$f0,PPRV_Control2(a6)
  2470.         or.b    d0,PPRV_Control2(a6)
  2471.         rts
  2472.  
  2473. ;------------------------------------------------------------------------------
  2474. ; E4 - VIBRATO CONTROL
  2475. ;------------------------------------------------------------------------------
  2476.  
  2477. PPR_setvibratoctrl
  2478.         move.b    PPRV_PatternDat+3(a6),d0
  2479.         and.b    #$0f,d0
  2480.         and.b    #$f0,PPRV_Control1(a6)
  2481.         or.b    d0,PPRV_Control1(a6)
  2482.         rts
  2483.  
  2484. ;------------------------------------------------------------------------------
  2485. ; E5 - SET FINETUNE
  2486. ;------------------------------------------------------------------------------
  2487.  
  2488.     ifne PPR_Finetune
  2489. PPR_setfinetune    move.b    PPRV_PatternDat+3(a6),d0
  2490.         and.b    #$0f,d0
  2491.         move.b    d0,PPRV_Finetune(a6)
  2492.         rts
  2493.     endc
  2494.  
  2495. ;------------------------------------------------------------------------------
  2496. ; E6 - PATTERN LOOP
  2497. ;------------------------------------------------------------------------------
  2498.  
  2499. PPR_PatternLoop    move.b    PPRV_PatternDat+3(a6),d0
  2500.         and.b    #$0f,d0
  2501.         beq.s    PPR_setloop
  2502.  
  2503.         tst.b    PPRV_PLoopCount(a6)
  2504.         beq.s    PPR_jumpcnt
  2505.  
  2506.         subq.b    #1,PPRV_PLoopCount(a6)
  2507.         beq.w    PPR_return
  2508.  
  2509. PPR_jmploop     move.b    PPRV_PLoopPos(a6),PPRM_PBreakPos(a4)
  2510.         st    PPRM_PBreakFl(a4)
  2511.         rts
  2512.  
  2513. PPR_jumpcnt    move.b    d0,PPRV_PLoopCount(a6)
  2514.         bra.s    PPR_jmploop
  2515.  
  2516. PPR_setloop    move.w    PPRM_PatternPos(a4),d0    ; Store loop position
  2517.         lsr.w    #2,d0            ; /2 = number offset
  2518.         move.b    d0,PPRV_PLoopPos(a6)
  2519.         rts
  2520.  
  2521. ;------------------------------------------------------------------------------
  2522. ; E7 - TREMOLO CONTROL
  2523. ;------------------------------------------------------------------------------
  2524.  
  2525. PPR_settremoloctrl
  2526.         move.b    PPRV_PatternDat+3(a6),d0
  2527.         and.b    #$0f,d0
  2528.         lsl.b    #4,d0
  2529.         and.b    #$0f,PPRV_Control1(a6)
  2530.         or.b    d0,PPRV_Control1(a6)
  2531.         rts
  2532.  
  2533. ;------------------------------------------------------------------------------
  2534. ; E9 - RETRIG NOTE
  2535. ;------------------------------------------------------------------------------
  2536.  
  2537. PPR_retrignote
  2538. ;        move.l    d1,-(sp)
  2539.         move.b    PPRV_PatternDat+3(a6),d0
  2540.         and.w    #$0f,d0
  2541.         beq.w    PPR_rtnend
  2542.  
  2543.         moveq.l    #0,d1
  2544.         move.b    PPRM_Counter(a4),d1
  2545.         bne.s    PPR_rtnskp        ; If start of note...
  2546.  
  2547.     ifeq PPR_PowerPatt
  2548.         move.w    PPRV_PatternDat(a6),d1    ; ...only trig if note set!
  2549.         and.w    #$0fff,d1
  2550.         bne.w    PPR_rtnend
  2551.     else
  2552.         move.b    PPRV_PatternDat(a6),d1
  2553.         bne.w    PPR_rtnend
  2554.     endc
  2555.  
  2556.         moveq.l    #0,d1
  2557.         move.b    PPRM_Counter(a4),d1
  2558.  
  2559. PPR_rtnskp    divu    d0,d1
  2560.         swap    d1
  2561. ;        tst.w    d1
  2562. ;        bne.s    PPR_rtnend
  2563.         dbra    d1,PPR_rtnend        ; ...Not the time?
  2564.  
  2565. PPR_doretrig
  2566.     ifeq PPR_NotePlayer
  2567.         move.w    PPRV_DMAMask(a6),$dff096; Channel DMA off
  2568.         PPR_WAIT 1
  2569.         move.l    PPRV_SamplePtr(a6),(a5)    ; Set sampledata pointer
  2570.         move.w    PPRV_PlaySize(a6),4(a5)    ; Set length
  2571.         PPR_WAIT 4
  2572.         move.w    PPRV_DMAMask(a6),d0
  2573.         or.w    #2^15,d0        ; BSET #15,d0
  2574.         move.w    d0,$dff096        ; Channel DMA on
  2575. PPR_Dummy02    PPR_WAIT 1
  2576.         move.l    PPRV_LoopStart(a6),(a5)    ; Write more data...
  2577.         move.l    PPRV_RepLen(a6),4(a5)
  2578.     else
  2579.         PPRN_TrigWave PPRV_SamplePtr(a6),PPRV_PlaySize(a6)
  2580.         PPRN_SetWave PPRV_LoopStart(a6),PPRV_RepLen(a6)
  2581.     endc
  2582.  
  2583. PPR_rtnend
  2584. ;        move.l    (sp)+,d1
  2585.         rts
  2586.  
  2587. ;------------------------------------------------------------------------------
  2588. ; EA - VOLUME FINESLIDE UP
  2589. ;------------------------------------------------------------------------------
  2590.  
  2591. PPR_volumefineup
  2592.         move.b    PPRV_PatternDat+3(a6),d0
  2593.         and.w    #$f,d0
  2594.         bra.w    PPR_volslideup
  2595.  
  2596. ;------------------------------------------------------------------------------
  2597. ; EB - VOLUME FINESLIDE DOWN
  2598. ;------------------------------------------------------------------------------
  2599.  
  2600. PPR_volumefinedown
  2601.         move.b    PPRV_PatternDat+3(a6),d0
  2602.         and.w    #$0f,d0
  2603.         bra.w    PPR_volslidedown2
  2604.  
  2605. ;------------------------------------------------------------------------------
  2606. ; EB - NOTECUT
  2607. ;------------------------------------------------------------------------------
  2608.  
  2609. PPR_notecut    move.b    PPRV_PatternDat+3(a6),d0
  2610.         and.w    #$0f,d0
  2611.         cmp.b    PPRM_Counter(a4),d0
  2612.         bne.w    PPR_return        ; Has the time come?
  2613.  
  2614.         clr.b    PPRV_Volume(a6)
  2615.  
  2616.     ifeq PPR_NotePlayer
  2617.         move.w    #0,8(a5)
  2618.     else
  2619.         PPRN_SetVolume #0
  2620.     endc
  2621.         rts
  2622.  
  2623. ;------------------------------------------------------------------------------
  2624. ; ED - NOTEDELAY
  2625. ;------------------------------------------------------------------------------
  2626.  
  2627. PPR_notedelay    move.b    PPRV_PatternDat+3(a6),d0
  2628.         and.w    #$0f,d0
  2629.         cmp.b    PPRM_Counter(a4),d0    ; Has the time come?
  2630.         bne.w    PPR_return
  2631.  
  2632.         move.w    PPRV_PatternDat(a6),d0
  2633.         beq.w    PPR_return
  2634. ;        move.l    d1,-(sp)
  2635.         bra.w    PPR_doretrig        ; Trig note
  2636.  
  2637. ;------------------------------------------------------------------------------
  2638. ; EE - PATTERN DELAY
  2639. ;------------------------------------------------------------------------------
  2640.  
  2641. PPR_patterndelay
  2642.         move.b    PPRV_PatternDat+3(a6),d0
  2643.         and.w    #$0f,d0
  2644.         tst.b    PPRM_PtDelTime(a4)
  2645.         bne.w    PPR_return        ; We are already delaying...
  2646.         tst.b    PPRM_PtDelCount(a4)
  2647.         bne.w    PPR_return        ; We are already delaying...
  2648.         addq.b    #1,d0
  2649.         move.b    d0,PPRM_PtDelTime(a4)    ; Store delay count
  2650.         rts
  2651.  
  2652. ;------------------------------------------------------------------------------
  2653. ; EF - FUNKREPEAT
  2654. ;------------------------------------------------------------------------------
  2655.  
  2656. PPR_funkit    move.b    PPRV_PatternDat+3(a6),d0
  2657.         and.b    #$0f,d0
  2658.         lsl.b    #4,d0
  2659.         and.b    #$0f,PPRV_Control2(a6)
  2660.         or.b    d0,PPRV_Control2(a6)    ; Store speed
  2661.         tst.b    d0
  2662.         beq.w    PPR_return        ; If no speed, return
  2663.  
  2664. PPR_updatefunk
  2665. ;        movem.l    d1/a0,-(sp)
  2666.         moveq.l    #0,d0
  2667.         move.b    PPRV_Control2(a6),d0
  2668.         lsr.b    #4,d0            ; Get speed
  2669.         beq.s    PPR_funkend        ; No speed, no funk
  2670.  
  2671.         lea.l    PPR_funktable(pc),a1
  2672.         move.b    (a1,d0.w),d0
  2673.         add.b    d0,PPRV_FunkDuh(a6)
  2674.  
  2675.         btst    #7,PPRV_FunkDuh(a6)    ; Y = 128?
  2676.         beq.s    PPR_funkend        ; No...
  2677.  
  2678.         clr.b    PPRV_FunkDuh(a6)    ; Y = 0
  2679.  
  2680.         move.l    PPRV_LoopStart(a6),d0
  2681.         moveq.l    #0,d1
  2682.         move.w    PPRV_RepLen(a6),d1
  2683.         add.l    d1,d0
  2684.         add.l    d1,d0
  2685.         move.l    PPRV_FunkPtr(a6),a0
  2686.         addq.l    #1,a1
  2687.         cmp.l    d0,a1
  2688.         blo.s    PPR_funkok
  2689.         move.l    PPRV_LoopStart(a6),a1    ; Init pointer
  2690.  
  2691. PPR_funkok    move.l    a1,PPRV_FunkPtr(a6)
  2692.         neg.b    (a1)
  2693.         subq.b    #1,(a1)
  2694.  
  2695. PPR_funkend
  2696. ;        movem.l    (sp)+,d1/a0
  2697.         rts
  2698.  
  2699. ;------------------------------------------------------------------------------
  2700. ;    Tables and miscellaneous stuff...
  2701. ;------------------------------------------------------------------------------
  2702.  
  2703. PPR_funktable    dc.b   0,  5,  6,  7,  8, 10, 11, 13
  2704.         dc.b  16, 19, 22, 26, 32, 43, 64,128
  2705.  
  2706. PPR_vibratotable
  2707.         dc.b   0, 24, 49, 74, 97,120,141,161
  2708.         dc.b 180,197,212,224,235,244,250,253
  2709.         dc.b 255,253,250,244,235,224,212,197
  2710.         dc.b 180,161,141,120, 97, 74, 49, 24
  2711.  
  2712.         dc.w    0
  2713. PPR_periodtable
  2714. ; tuning 0, normal
  2715.         dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  2716.         dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  2717.         dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  2718.         dcb.w    64-36,0
  2719.  
  2720.     ifne PPR_Finetune
  2721. ; tuning 1
  2722.         dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  2723.         dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  2724.         dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  2725.         dcb.w    64-36,0
  2726. ; tuning 2
  2727.         dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  2728.         dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  2729.         dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  2730.         dcb.w    64-36,0
  2731. ; tuning 3
  2732.         dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  2733.         dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  2734.         dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  2735.         dcb.w    64-36,0
  2736. ; tuning 4
  2737.         dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  2738.         dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  2739.         dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  2740.         dcb.w    64-36,0
  2741. ; tuning 5
  2742.         dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  2743.         dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  2744.         dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  2745.         dcb.w    64-36,0
  2746. ; tuning 6
  2747.         dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  2748.         dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  2749.         dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  2750.         dcb.w    64-36,0
  2751. ; tuning 7
  2752.         dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  2753.         dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  2754.         dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  2755.         dcb.w    64-36,0
  2756. ; tuning -8
  2757.         dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  2758.         dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  2759.         dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  2760.         dcb.w    64-36,0
  2761. ; tuning -7
  2762.         dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  2763.         dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  2764.         dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  2765.         dcb.w    64-36,0
  2766. ; tuning -6
  2767.         dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  2768.         dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  2769.         dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  2770.         dcb.w    64-36,0
  2771. ; tuning -5
  2772.         dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  2773.         dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  2774.         dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  2775.         dcb.w    64-36,0
  2776. ; tuning -4
  2777.         dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  2778.         dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  2779.         dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  2780.         dcb.w    64-36,0
  2781. ; tuning -3
  2782.         dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  2783.         dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  2784.         dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  2785.         dcb.w    64-36,0
  2786. ; tuning -2
  2787.         dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  2788.         dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  2789.         dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  2790.         dcb.w    64-36,0
  2791. ; tuning -1
  2792.         dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  2793.         dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  2794.         dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  2795.         dcb.w    64-36,0
  2796.     endc
  2797.         dc.w    0
  2798.  
  2799.     CNOP    0,4
  2800.  
  2801. PPR_MainData    dcb.b    PPRM_sizeof,0
  2802.  
  2803. PPR_VoiceData    dcb.b    PPRV_sizeof*4,0
  2804.  
  2805.  
  2806.     SECTION Module,DATA_C
  2807.  
  2808.     INCDIR    "!SOURCES:PRODUCTIONS/PTSUPP/PROPRUNER/"
  2809.  
  2810. Module    INCBIN    "PPR.BLOB"
  2811.     ;INCBIN    "PPR.PANIC UTEN ERROR..."
  2812.     ;INCBIN    "PPR.CHIP_3"
  2813.     ;INCBIN    "PPR.TETRIS THEME"
  2814.     ;INCBIN    "PPR.NOW WHAT 3"
  2815.     ;INCBIN "HD2:PPR.A"
  2816.  
  2817.